如何在java8中使用streams重写下面的代码 private void enrichWithFieldList(字符串描述、字符串值、列表数据列表、列表字段列表){ int指数=1; 用于(数据:数据列表){ if(!“english”.equals(data.getCode())){ createFieldList(desc+索引,data.getCode(),fieldList); createFieldList(value+index++,data.getValue(),fieldList); } } } 私有void createFieldList(字符串字段名、字符串字段值、列表字段列表){ 字段customField=新字段(); customField.setName(fieldName); customField.setValue(fieldValue); fieldList.add(自定义字段); }
有谁能告诉我如何用Java8流重写上面的代码吗 你可以写这个,尽管它可能更复杂如何在java8中使用streams重写下面的代码 private void enrichWithFieldList(字符串描述、字符串值、列表数据列表、列表字段列表){ int指数=1; 用于(数据:数据列表){ if(!“english”.equals(data.getCode())){ createFieldList(desc+索引,data.getCode(),fieldList); createFieldList(value+index++,data.getValue(),fieldList); } } } 私有void createFieldList(字符串字段名、字符串字段值、列表字段列表){ 字段customField=新字段(); customField.setName(fieldName); customField.setValue(fieldValue); fieldList.add(自定义字段); },java,java-8,java-stream,Java,Java 8,Java Stream,有谁能告诉我如何用Java8流重写上面的代码吗 你可以写这个,尽管它可能更复杂 private void enrichWithFieldList(String desc, String value, List<Data> dataList, List<Field> fieldList) { int index = 1; for(Data data : dataList){ if(!"english".equals(d
private void enrichWithFieldList(String desc, String value, List<Data> dataList, List<Field> fieldList) {
int index = 1;
for(Data data : dataList){
if(!"english".equals(data.getCode())){
createFieldList(desc+index, data.getCode(), fieldList);
createFieldList(value+index++, data.getValue(), fieldList);
}
}
}
private void createFieldList(String fieldName, String fieldValue, List<Field> fieldList) {
Field customField = new Field();
customField.setName(fieldName);
customField.setValue(fieldValue);
fieldList.add(customField);
}
据我所知,你正在尝试根据你的数据列表来创建一个新的字段列表。如果是这样,最好直接从流创建,而不是添加到传递到方法中的列表中 如下所示:
private Map<String, String> asMap(Collection<Data> data) {
return data.stream()
.filter(d -> !"english".equals(d.getCode())
.collect(Collectors.toMap(Data:getCode, Data:getValue));
}
private List makenrichedfieldlist(字符串描述、字符串值、列表数据列表){
返回IntStream.range(0,dataList.size())
.filter(i->!dataList.get(i).getCode().equals(“英语”))
.装箱()
.flatMap(i->Stream.of(新字段(desc+i+1,dataList.get(i).getCode()),
新字段(值+i+1,dataList.get(i).getValue())
.collect(Collectors.toList());
}
既然您说您不能更改字段来添加构造函数,那么您应该保留您的工厂方法,但您应该让它创建实例而不处理列表
s:
private List<Field> makeEnrichedFieldList(String desc, String value, List<Data> dataList) {
return IntStream.range(0, dataList.size())
.filter(i -> !dataList.get(i).getCode().equals("english"))
.boxed ()
.flatMap(i -> Stream.of(new Field(desc + i + 1, dataList.get(i).getCode()),
new Field(value + i + 1, dataList.get(i).getValue()))
.collect(Collectors.toList());
}
然后,已经引导到正确的解决方案。如果需要索引,解决方案是使用IntStream
索引并将它们映射到List
元素,而不是在列表上进行流式处理并尝试重新构建索引。然后,flatMap
是将一个元素映射到两个元素的正确操作条件可以作为平面图
之前的过滤器
操作来实现,也可以集成到平面图
操作中,如果条件未满足,则该操作可能映射到空流(或仅为空
)
只有一个缺点。当前API缺少IntStream.flatMapToObj(…)
操作。一个简单的解决方法是使用boxed().flatMap(…)
,就像sprinter的答案一样,它有装箱开销的缺点,或者使用mapToObj(…).flatMap(t->t)
首先将int
值映射到Stream
s对象,然后对Stream
而不是IntStream
执行展平:
private Field createField(String fieldName, String fieldValue) {
Field customField = new Field();
customField.setName(fieldName);
customField.setValue(fieldValue);
return customField;
}
但是还有另一种选择。因为在这种情况下,中间步骤并不能真正简化流代码,我们可以将它们合并到collect
操作中,而不会失去可读性:
private void enrichWithFieldList(
String desc, String value, List<Data> dataList, List<Field> fieldList) {
List<Field> collected=IntStream.rangeClosed(1, dataList.size())
.mapToObj(index -> {
Data data=dataList.get(index-1);
return "english".equals(data.getCode())? null:
Stream.of(createField(desc+index, data.getCode()),
createField(value+index, data.getValue()));
}).flatMap(t->t)
.collect(Collectors.toList());
fieldList.addAll(collected);
}
private void enrichWithFieldList(
字符串描述、字符串值、列表数据列表、列表字段列表){
收集的列表=IntStream.rangeClosed(1,dataList.size())
.collect(ArrayList::new,(列表,索引)->{
数据=dataList.get(索引-1);
if(!“english”.equals(data.getCode())){
add(createField(desc+索引,data.getCode());
添加(createField(value+index,data.getValue());
}
},列表::addAll);
fieldList.addAll(已收集);
}
然后我们根本没有从IntStream
到Stream
的转换
但是请注意,普通循环看起来可能仍然比这个简单。除非您有相当大的列表要处理,并且正在考虑并行处理它们,否则流API在这里不是一个胜利。如果您有一个可变变量,这并不真的适合作为流。您确定要一个字段列表而不是映射。顺便说一句,它是一个bad我想使用一个普通类的名称。谢谢@PeterLawrey的快速回复,如果它是一个映射而不是ListThank@Peter Lawrey为您的帖子,但是Field类是Jaxb生成的类,没有构造函数,在这种情况下,我如何设置属性,在我的要求中,我想将List作为参数传递,并需要添加每个字段反对list@NareshBandaru您可以创建帮助器方法,调用默认构造函数和设置器,如上面的方法。dataList.get(1)
?desc+i+1
?未知字段构造函数。dataList.get(1)
当然应该是dataList.get(i)
。除此之外,您正在执行不必要的装箱和取消装箱操作。只需将.boxed()
调用移动到.filter(…)
操作,就在flatMap
之前,过滤可以工作,而无需为每个流元素取消装箱整数。此外,只有通过过滤器的元素才会装箱。
private void enrichWithFieldList(
String desc, String value, List<Data> dataList, List<Field> fieldList) {
List<Field> collected=IntStream.rangeClosed(1, dataList.size())
.filter(index -> !"english".equals(dataList.get(index-1).getCode()))
.mapToObj(index -> {
Data data=dataList.get(index-1);
return Stream.of(createField(desc+index, data.getCode()),
createField(value+index, data.getValue()));
}).flatMap(t->t)
.collect(Collectors.toList());
fieldList.addAll(collected);
}
private void enrichWithFieldList(
String desc, String value, List<Data> dataList, List<Field> fieldList) {
List<Field> collected=IntStream.rangeClosed(1, dataList.size())
.mapToObj(index -> {
Data data=dataList.get(index-1);
return "english".equals(data.getCode())? null:
Stream.of(createField(desc+index, data.getCode()),
createField(value+index, data.getValue()));
}).flatMap(t->t)
.collect(Collectors.toList());
fieldList.addAll(collected);
}
private void enrichWithFieldList(
String desc, String value, List<Data> dataList, List<Field> fieldList) {
List<Field> collected=IntStream.rangeClosed(1, dataList.size())
.collect(ArrayList::new, (list, index) -> {
Data data=dataList.get(index-1);
if(!"english".equals(data.getCode())) {
list.add(createField(desc+index, data.getCode()));
list.add(createField(value+index, data.getValue()));
}
}, List::addAll);
fieldList.addAll(collected);
}