2017-02-16 19 views
-1

我想将一个列表映射到另一个列表。第一份清单的所有内容都将作出决定。下面是它会是什么样子,在糟糕的代码:使用流生成一个新的列表考虑到所有的第一个列表元素

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个流才能够做到这一点。

也许使用收集器?

谢谢。

+0

能不能请你重写你的代码是正确的Java?这真的很烦人阅读。 –

+1

这甚至不编译 – kamehl23

+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()); 
    } 
} 
+0

这里不需要'列表 enumsList = Arrays.asList(...)'。你可以直接流数组:'Arrays.stream(TheEnums.values())。 ...'。或者你使用'EnumSet.allOf(TheEnums.class).stream()。 ...' – Holger

相关问题