如何解决Java Streams功能转换/丰富数据
我想将DataX
写入List<DataY>
变换/丰富函数
class DataX {
private String a;
private List<String> c;
}
class DataY {
private String a;
private String b;
private String cx;
}
JSON表示形式
输入
{
"a": "abc-123","c": ["c1","c2","c3","c4","c5"]
}
在处理c的每个元素时,将根据查找表(可以是数据库,本地缓存或REST查找)检查该值,并且某些值会从1映射到许多。
c1 -> c1
c2 -> c2
c3 -> c31,c32,c33
c4 -> c4
c5 -> c51,c52
预期输出
[
{
"a": "abc-123","b": "xyz-1","cx": "c1"
},{
"a": "abc-123","b": "xyz-2","cx": "c2"
},"b": "xyz-3","cx": "c31"
},"b": "xyz-4","cx": "c32"
},"b": "xyz-5","cx": "c33"
},"b": "xyz-6","cx": "c4"
},"b": "xyz-7","cx": "c51"
},"b": "xyz-8","cx": "c52"
}
]
注意:值b表示通过UUID.randomUUID()方法生成的UUID
我的尝试
public class Test {
public static void main(String[] args) {
DataX dataX = new DataX("abc-123",Arrays.asList("c1","c5"));
List<DataY> collect = dataX.getC().stream()
.map(c -> new DataY(dataX.getA(),UUID.randomUUID().toString(),c))
.map(dataY -> { // use flatMap here?
if (isOneToMany(dataY.getCx()))
return operationOneToMany(dataY.getCx());
else
return dataY.getCx();
})
.collect(Collectors.toList());
}
private static boolean isOneToMany(String input) {
return (Arrays.asList("c3","c5").contains(input));
}
// Shall I apply this to each element,and return list of 1 or list of many elements
private static Optional<List<String>> operationOneToMany(String input) {
if ("c3".equals(input))
return Optional.of(Arrays.asList("c31","c32","c33"));
else if ("c5".equals(input))
return Optional.of(Arrays.asList("c51","c52"));
else
return Optional.empty();
}
}
顺便说一句,它不起作用
工作代码,但不确定是否经过优化
public class Test2 {
public static void main(String[] args) {
DataX dataX = new DataX("abc-123","c5"));
System.out.println("dataX = " + dataX);
List<DataY> collect = dataX.getC().stream()
.map(c -> operationOneToMany(c))
.flatMap(e -> e.stream())
.map(c -> new DataY(dataX.getA(),c))
.collect(Collectors.toList());
System.out.println("collect = " + collect);
}
private static List<String> operationOneToMany(String input) {
if ("c3".equals(input))
return Arrays.asList("c31","c33");
else if ("c5".equals(input))
return Arrays.asList("c51","c52");
else
return Arrays.asList(input);
}
}
解决方法
如@Rono所建议
public class Test2 {
public static void main(String[] args) {
DataX dataX = new DataX("abc-123",Arrays.asList("c1","c2","c3","c4","c5"));
System.out.println("dataX = " + dataX);
List<DataY> collect = dataX.getC().stream()
.flatMap(e -> operationOneToMany(e).stream())
.map(c -> new DataY(dataX.getA(),UUID.randomUUID().toString(),c))
.collect(Collectors.toList());
System.out.println("collect = " + collect);
}
private static List<String> operationOneToMany(String input) {
if ("c3".equals(input))
return Arrays.asList("c31","c32","c33");
else if ("c5".equals(input))
return Arrays.asList("c51","c52");
else
return Arrays.asList(input);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。