Tag: java stream

递归使用Stream.flatMap()

考虑以下课程: public class Order { private String id; private List orders = new ArrayList(); @Override public String toString() { return this.id; } // getters & setters } 注意:请务必注意,我无法修改此类 ,因为我正在使用外部API。 还要考虑以下订单层次结构: Order o1 = new Order(); o1.setId(“1”); Order o11 = new Order(); o11.setId(“1.1”); Order o111 = new Order(); o111.setId(“1.1.1”); List o11Children = new ArrayList(Arrays.asList(o111)); o11.setOrders(o11Children); Order […]

Collectors.summingInt()vs mapToInt()。sum()

如果要对流中的整数值求和,有两种主要方法: ToIntFunction mapFunc = … int sum = stream().collect(Collectors.summingInt(mapFunc)) int sum = stream().mapToInt(mapFunc).sum() 第一个涉及装箱返回的整数并将其拆箱,但第二个步骤涉及额外的步骤。 哪个更有效/更清晰?

在Java 8中用流替换嵌套for循环的正确方法是什么?

在学习Java 8流和lambas时,我尝试用流替换以下嵌套for循环: List deskIds = new ArrayList(); for(ProvidedService memberService : service.getAllNodesDepthFirst()){ for(Desk d : memberService.getDesks()){ deskIds.add(d.getId()); } } 循环迭代一个’ProvidedService’对象列表,并为每个对象迭代’Desk’对象的list属性,并将’Id’字段提取到列表中。 我使用流来提出以下代码: List deskIds = new ArrayList(); service.getAllNodesDepthFirst().stream().forEach(srv -> { deskIds.addAll(srv.getDesks().stream().map(Desk::getId).collect(Collectors.toList())); }); 这是正确/最佳的方式吗? 或者有没有办法在没有第二个嵌套流的情况下执行此操作?

递归流

我想使用Java 8以递归方式列出计算机上的所有文件。 Java 8提供了一个listFiles方法,该方法返回所有文件和目录,但没有递归。 如何使用它来获取完整的递归文件列表(不使用变异集合)? 我已经尝试了下面的代码,但它只有一个深度: static Function<Path, Stream> listFiles = p -> { if (p.toFile().isDirectory()) { try { return Files.list(p); } catch (Exception e) { return Stream.empty(); } } else { return Stream.of(p); } }; public static void main(String[] args) throws IOException { Path root = Paths.get(“C:/temp/”); Files.list(root).flatMap(listFiles).forEach(System.out::println); } 并使用return Files.list(p).flatMap(listFiles); 不编译(不确定原因)…… 注意:我对涉及FileVisitors或外部库的解决方案不感兴趣。

Java 8中的顺序流是否在调用collect时使用组合器参数?

如果我在顺序流上调用collect(例如,从调用Collection.stream()),那么它将使用我传递的汇编参数来收集吗? 我猜不是,但我在文档中看不到任何内容。 如果我是正确的,那么似乎不幸的是必须提供我知道不会被使用的东西(如果我知道它是顺序流)。

Java流是连续阶段的吗?

我对中间阶段顺序状态有疑问 – 是应用于所有输入流(项)的阶段的操作还是应用于每个流项的所有阶段/操作? 我知道这个问题可能不容易理解,所以我举一个例子。 在以下流处理中: List strings = Arrays.asList(“Are Java streams intermediate stages sequential?”.split(” “)); strings.stream() .filter(word -> word.length() > 4) .peek(word -> System.out.println(“f: ” + word)) .map(word -> word.length()) .peek(length -> System.out.println(“m: ” + length)) .forEach(length -> System.out.println(“-> ” + length + “\n”)); 我对这段代码的期望是它会输出: f: streams f: intermediate f: stages f: sequential? m: 7 […]

使用Java中的stream.sorted()对列表进行排序

我有兴趣从流中排序列表。 这是我正在使用的代码: list.stream() .sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue())) .collect(Collectors.toList()); 我错过了什么吗? 该列表没有排序。 它应该根据具有最低值的项目对列表进行排序。 for (int i = 0; i < list.size(); i++) { System.out.println("list " + (i+1)); print(list, i); } 和打印方法: public static void print(List list, int i) { System.out.println(list.get(i).getItem().getValue()); }

JPA懒惰列表上的流

我有这样的列表的JPA实体: @OneToMany(mappedBy = “scadaElement”, orphanRemoval = true) private List elementParameters; 和地图formsElementParameter @ManyToOne @JoinColumn(name = “SCADAELEMENT_ID”) ScadaElement scadaElement; 当我获得带有elementParameters列表的实体并在其上执行流时,什么都不做,即使我使用.size()触发列表但是当我使用for循环执行相同操作时。 System.out.println(“elements size: ” + s.getElementParameters().size()); s.getElementParameters() .stream() .forEach( a -> { System.out.println(“elementId: ” + a.getId()); } ); 是否有任何解决方案使该流工作? 我使用eclipselink作为JPA提供者。

为什么我要在并行流中使用并发特性和collect?

为什么我要在并行流中使用并发特性和collect: List list = Collections.synchronizedList(new ArrayList(Arrays.asList(1, 2, 4))); Map collect = list.stream().parallel() .collect(Collectors.toConcurrentMap(k -> k, v -> v, (c, c2) -> c + c2)); 并不是: Map collect = list.stream().parallel() .collect(Collectors.toMap(k -> k, v -> v, (c, c2) -> c + c2)); 换句话说,不使用此特性会产生什么副作用,它对内部流操作有用吗?

Java 8流条件处理

我有兴趣将一个流分成两个或多个子流,并以不同的方式处理这些元素。 例如,(大)文本文件可能包含类型A的行和类型B的行,在这种情况下,我想要执行以下操作: File.lines(path) .filter(line -> isTypeA(line)) .forEachTrue(line -> processTypeA(line)) .forEachFalse(line -> processTypeB(line)) 以前是我尝试抽象的情况。 实际上我有一个非常大的文本文件,其中每一行都是针对正则表达式进行测试的; 如果该行通过,则处理它,而如果它被拒绝,那么我想更新一个计数器。 对拒绝字符串的进一步处理是我不仅仅使用filter 。 有没有合理的方法用流来做这个,还是我必须回退到循环? (我希望这也是并行运行,所以溪流是我的第一选择)。