使用Streams生成一个新列表,同时考虑所有第一个列表元素

时间:2017-02-16 13:22:44

标签: java java-8 java-stream

我想将列表映射到另一个列表。决定在第一个清单的所有要素上做出决定。在糟糕的代码中,它的外观如下:

import java.lang.Math;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;


public class HelloWorld
{
  public static void main(String[] args)
  {
    MatchingClass myObject = new MatchingClass();
    System.out.println(myObject.getMatchingEnums(Arrays.asList("param1", "param3", "param2")));
    System.out.print(myObject.getMatchingEnums(Arrays.asList("param1", "param3", "param4")));

  }
}

enum TheEnums {
    elem1("param1", "param2"),
    elem2("param1", "param3");

  String[] parameters;
  TheEnums (String... parameters){
    this.parameters = parameters;
  }

  String[] getParams (){
    return parameters; 
  }

}

// you can add other public classes to this editor in any order
public class MatchingClass 
{
  public List<TheEnums> getMatchingEnums (List<String> givenParameters) {
    List<TheEnums> result = new ArrayList<>();
    for (TheEnums theEnum : TheEnums.values()){
      if (givenParameters.containsAll(Arrays.asList(theEnum.getParams()))){
            result.add (theEnum);
      }
    }
    return result;
  }
}

这可以写得更好,但我想知道的是我们是否可以使用Java 8 Stream来做到这一点。

也许使用收藏家?

感谢。

1 个答案:

答案 0 :(得分:1)

例如:

class MatchingClass {
    public List<TheEnums> getMatchingEnums(List<String> givenParameters) {

        List<TheEnums> enumsList = Arrays.asList(TheEnums.values());

        return enumsList.stream()
                .filter(e -> givenParameters.containsAll(Arrays.asList(e.getParams())))
                .collect(Collectors.toList());
    }
}