【问题标题】:How to work with Java 8 streams?如何使用 Java 8 流?
【发布时间】:2015-06-06 12:39:17
【问题描述】:

我想知道如何使用Java 8 流以及如何使用不同类型的可用流操作。 比如我写了这部分代码:

ArrayList<State> toBeRemoved = new ArrayList<>();
for (State s : newStates)
     if (path.contains(s))     // path is a stack of State
         toBeRemoved.add(s);
for (State s : toBeRemoved)
     newStates.remove(s);

我想用java 8 stream api calls 重写它。我该怎么做?

【问题讨论】:

  • 流在不可变数据结构(或您视为不可变的数据结构,更准确地说)上效果最佳。如果您尝试修改现有的数据结构,例如您在此处使用newStates,您可能不想使用流。

标签: java foreach java-8 java-stream


【解决方案1】:

这里不需要流,你可以使用the new Collection#removeIf method

newStates.removeIf(path::contains);

或者,如果pathCollection

newStates.removeAll(path);

【讨论】:

  • newStates.removeAll(path);...
  • @Holger 确实是 ;-) 我没有注意到路径(可能)是一个集合。
  • 我很惊讶他们添加了这个removeIf 默认方法。看起来很具体。
【解决方案2】:

在这种情况下,您可以简单地生成一个仅包含应保留的状态的输出列表,并将该列表分配给newStates 变量:

newStates = newStates.stream()
                     .filter(s -> !path.contains(s))
                     .collect(Collectors.toList());

过滤器只保留 path.contains(s) 返回 false 的状态。

当然,如果newStates最初被初始化为一些“oldStates”列表的副本,您可以跳过该初始化步骤并使用原始“oldStates”列表作为输入。

【讨论】:

  • 谢谢。这行得通,但我需要知道如何使用这个 api。请写一个简单的教程之类的。不只是这种情况。谢谢。
  • @Rasoolll Please write a simple toturial。我不这么认为。谷歌搜索“Java 8 Streams 教程”怎么样?
  • 试过了。没发现什么好东西。现在,我对你的答案投了赞成票。我会等几个小时,如果没有人回答得比你好,那么你的回答将被接受。再次感谢朋友。 :)
  • @Rasoolll 所以你用谷歌搜索了“Java 8 Streams”并没有发现什么好东西?关于该主题有数十篇很棒的帖子和文章。 Oracle 有关于这个主题的 Java 教程。流包上的 API 文档非常好,更不用说越来越多的关于这个主题的好书了。我想说你需要的帮助是提高你的调查技能。
  • @EdwinDalorzo 好的。我会更加努力。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2015-11-14
  • 2021-12-20
相关资源
最近更新 更多