【问题标题】:Convert For-Loop into Java stream将 For-Loop 转换为 Java 流
【发布时间】:2019-10-09 23:27:54
【问题描述】:

我是 Java 8 流的新手,我目前正在尝试将 for 循环转换为 Java 8 流。我能得到一些帮助吗?

for (Subscription sub : sellerSubscriptions) {
    if (orders.get(Product).test(sub)) {
        orderableSubscriptions.add(sub.getId());
    }
}

sellerSubscriptions = List.

orders = Map<String,Predicate<Subscription>>

orderableSubscriptions = Set<String>

【问题讨论】:

  • 你试一试怎么样,试了之后问问自己做错了什么?
  • @Stultuske,或者像他一样发布问题。是否有人喜欢挑战并提供快速答案? :-)
  • orders.get(Product) 甚至意味着什么? Product 是什么?
  • @Naman Product 是一个字符串,orders.get(Product) 基本上会查找与 Product 相同的键并运行谓词(映射中的值)。

标签: java for-loop java-stream


【解决方案1】:
  1. 通过Collection#stream() 方法创建Subscriptions 的Stream
  2. 使用Stream#filter() 方法“模拟”if 语句,过滤掉所有未通过给定谓词的订阅。
  3. 通过使用 Stream#map() 方法,您可以将订阅流转换为 ID 流
  4. 最后,通过使用Stream#collect(),您可以将流收集到您想要的任何内容中。例如。 Set

您的代码可能如下所示:

Set<String> ids = sellerSubscriptions.stream() // create a Stream<Subscription>
    .filter(orders.get(Product)::test)         // filter out everthing that doesn't match
    .map(Subscription::getId)                  // only use the ids from now on
    .collect(Collectors.toSet());              // create a new Set from the elements

一些注意事项:

  • Subscription::getId(方法引用)在功能上等于 lambda sub -&gt; sub.getId()
  • orders.get(Product)::test(也是一个方法引用)只检索谓词一次。因为它似乎是您所有订阅的同一个谓词
    • 虽然它不等于sub -&gt; orders.get(Product).test(sub),因为它会为每个元素调用orders.get(Product)

【讨论】:

  • 来自问题orderableSubscriptions = Set&lt;String&gt;
  • @Apollocy 不客气,我建议通过Stream 接口的java 文档来更好地了解您可以使用的所有不同方法。我展示的只是一些基础知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2021-03-01
  • 2020-06-28
  • 2021-06-06
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多