Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在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 - Fatal编程技术网

如何在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中使用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

有谁能告诉我如何用Java8流重写上面的代码吗

你可以写这个,尽管它可能更复杂

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);
}