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

Ara*_*ara 2 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 "";
}
Run Code Online (Sandbox Code Playgroud)

Mis*_*sha 8

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

如果p.getValues()是a List,你可以将它缩短为:

return params.stream()
  .filter(p -> key.equals(p.getKey())
  .flatMap(p -> p.getValues().stream())
  .findFirst()
  .orElse("");
Run Code Online (Sandbox Code Playgroud)

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