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

时间:2017-12-13 10:35:25

标签: java lambda collections 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
     */
}

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

有些事情:

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

如果我按照上述方法行事,我会错过应该是&#34;否则&#34;条件。如何使用更多java-8方式实现我想要的效果?

提前致谢!

4 个答案:

答案 0 :(得分:5)

我看到的唯一方法是将条件置于instruments -s devices 电话中。如果您使用map,则会丢失&#34;否则&#34;一部分。

filter

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

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());

答案 1 :(得分: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());

未经测试,但您明白了。

答案 2 :(得分:2)

您可以使用partitioningBy函数Predicate并返回Map<Boolean, List<T>>true键包含谓词的true值,false键包含其他值。

所以你可以像这样重写你的代码:

Map<Boolean, List<String>> partition = source.stream()
            .collect(Collectors.partitionBy(json -> !(json.get(bar) instanceof JSONObject));

在这种情况下,无需使用过滤功能。

List<String> valuesWhenTrue = partition.get(Boolean.TRUE).stream().map(item -> item.get(attribute).toString()).collect(Collectors.toList());   

List<String> valuesWhenFalse = partition.get(Boolean.FALSE).stream().map(json.getJSONObject(attribute).get("key").toString()).collect(Collectors.toList());

答案 3 :(得分:1)

如何将if-else提取到私有函数

private String obtainAttribute(JSONObject json){
  if (!(json.get(bar) instanceof JSONObject)) {
    return json.get(bar).toString();
  }
    return json.getJSONObject(attribute).get("key").toString();
}

并在lambda表达式中调用它。

    List<String> myList = source.stream()
    .map(item -> obtainAttribute(item))
    .collect(Collectors.toList());