Java 8:根据不同的过滤器流式传输列表并映射到另一个列表

iam*_*nos 2 java collections lambda java-8 java-stream

我有以下代码:

public boolean foo(List<JSONObject> source, String bar, String baz) {
    List<String> myList = newArrayList();

    source.forEach(json -> {
        if (!(json.get(bar) instanceof JSONObject)) {
            myList.add(json.get(bar).toString());
        } else {
            myList.add(json.getJSONObject(attribute).get("key").toString());
        }
    });

    /**
     * do something with myList and baz
     */
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有办法if-else使用过滤器进行内联条件.

有点像:

List<String> myList = source.stream()
                .filter(json -> !(json.get(bar) instanceof JSONObject))
                .map(item -> item.get(attribute).toString())
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果我按照上面的方法进行,我将错过应该是"其他"的条件.如何使用更多java-8方式实现我想要的目标?

提前致谢!

Era*_*ran 5

我看到的唯一方法是将条件置于map通话中.如果你使用filter你失去了"其他"部分.

List<String> myList = source.stream()
            .map(item -> {
                  if (!(item.get(bar) instanceof JSONObject)) {
                      return item.get(bar).toString();
                  } else {
                      return item.getJSONObject(attribute).get("key").toString();
                  }
            })
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者,正如Holger在评论中建议的那样,使用三元条件运算符:

List<String> myList = source.stream()
            .map(i -> (i.get(bar) instanceof JSONObject ? i.getJSONObject(attribute).get("key") : i.get(bar)).toString())
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • @Eugene:如果你担心列表的初始容量,可以使用`Arrays.asList(... stream op ... .toArray(ElementType [] :: new))`来获取没有容量增加操作的列表(如果流可以预测尺寸).但这很少是一个问题(或考虑,因为你注意到OP的原始代码也没有尝试指定列表的初始容量)... (2认同)

Ben*_*aye 5

这样的事情怎么样?

  List<String> myList = source.stream()
      .map(json -> !(json.get(bar) instanceof JSONObject) ? 
            json.get(bar).toString() : 
            json.getJSONObject(attribute).get("key").toString())
      .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

没有经过测试,但你明白了.