java - 如何将普通 Java for 循环转换为 Java 8 流?

标签 java java-8 java-stream

如何将此代码转换为 Java 8 流?

String getFirst(String key) {
    for (Param p : params) {
        if (key.equals(p.getKey())) {
            if (!p.getValues().isEmpty()) {
                return p.getValues().get(0);
            }
        }
    }
    return "";
}

最佳答案

return params.stream()
  .filter(p -> key.equals(p.getKey())
  .filter(p -> ! p.getValues().isEmpty())
  .map(p -> p.getValues().get(0))
  .findFirst()
  .orElse("");

如果p.getValues()是一个List,您可以将其缩短为:

return params.stream()
  .filter(p -> key.equals(p.getKey())
  .flatMap(p -> p.getValues().stream())
  .findFirst()
  .orElse("");

如果获取第一个匹配值并不重要,并且您可以只获取任何匹配值,请将findFirst()替换为findAny()。它将更清楚地标记您的意图,并且如果稍后有人使流并行,findAny() 可能会表现得更好。

关于java - 如何将普通 Java for 循环转换为 Java 8 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29452939/

相关文章:

java - 无法创建请求的服务 [org.hibernate.cache.spi.RegionFactory] ​​- Hibernate 4.3.8

java - (Java) 使用 Java8 将 JSONObject 的 JSONArray 展平为 [[]]

java - 使用 spock 在测试中生成对象列表

Java JUnit 5 AssertAll 流

java - 有没有办法压缩两个流?

java - 如何使用java动态地展平spark数据框中复杂的嵌套json

java - 无法从 Dropbox 下载文件

java - 切换 Activity 时简单的 Droid App 强制关闭

java - jaxb:枚举列表上的奇怪类转换异常

java - 使用流计算无穷和