Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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流在一次迭代中平面映射2个不同的字段?_Java_Functional Programming_Java 8_Java Stream - Fatal编程技术网

如何使用Java8流在一次迭代中平面映射2个不同的字段?

如何使用Java8流在一次迭代中平面映射2个不同的字段?,java,functional-programming,java-8,java-stream,Java,Functional Programming,Java 8,Java Stream,如果我有一个列表,其中每个元素包含2个列表字段,那么如何在一次迭代中通过主列表合并所有包含的列表 换句话说,使用流以函数形式表达以下命令式代码的最佳方式是什么 public class App { public static void main(String[] args) throws InterruptedException { List<Item> items = asList(new Item(singletonList("A"), singleton

如果我有一个
列表
,其中每个元素包含2个
列表
字段,那么如何在一次迭代中通过主列表合并所有包含的列表

换句话说,使用流以函数形式表达以下命令式代码的最佳方式是什么

public class App {
    public static void main(String[] args) throws InterruptedException {
        List<Item> items = asList(new Item(singletonList("A"), singletonList("B")),
                new Item(singletonList("C"), singletonList("D"))
        );

        List<String> set1 = new ArrayList<>(), set2 = new ArrayList<>();
        for (Item item : items) {
            set1.addAll(item.set1);
            set2.addAll(item.set2);
        }
    }

    private static class Item {
        public final List<String> set1, set2;

        public Item(List<String> set1, List<String> set2) {
            this.set1 = set1;
            this.set2 = set2;
        }
    }
}
公共类应用程序{
公共静态void main(字符串[]args)引发InterruptedException{
列表项=asList(新项(单音列表(“A”)、单音列表(“B”),
新项目(单音列表(“C”)、单音列表(“D”))
);
List set1=new ArrayList(),set2=new ArrayList();
用于(项目:项目){
set1.addAll(第set1项);
set2.addAll(第set2项);
}
}
私有静态类项{
公开最终清单set1、set2;
公共项目(列表集1、列表集2){
this.set1=set1;
this.set2=set2;
}
}
}

您要做的是使用两个不同的收集器收集流管道的结果。此外,每个收集器需要平面映射当前流项的
列表

此任务没有内置收集器,但您可以使用提供此类收集器的库:

Item item = StreamEx.of(items)
                    .collect(MoreCollectors.pairing(
                       MoreCollectors.flatMapping(i -> i.set1.stream(), Collectors.toList()),
                       MoreCollectors.flatMapping(i -> i.set2.stream(), Collectors.toList()),
                       Item::new)
                    );
此代码将两个收集器配对,将每个集合平面映射到
列表中
,并将结果存储到
项中
。此
项将包含
set1
set2
变量


收集器
flatMapping
将在Java 9()中提供。

只需使用两个独立、直接的流操作:

List<Item> items; 
List<String> set1=items.stream().map(i -> i.set1).flatMap(List::stream).collect(toList());
List<String> set2=items.stream().map(i -> i.set2).flatMap(List::stream).collect(toList());
列表项;
List set1=items.stream().map(i->i.set1).flatMap(List::stream).collect(toList());
List set2=items.stream().map(i->i.set2).flatMap(List::stream).collect(toList());

这需要2次迭代@是的,我知道。但只要实现“足够快”,可读性每次都胜过“性能”。此外,我怀疑2次迭代是否会产生可测量的差异。