使用Java流从超集获取子集
我需要从给定的超级列表中获取子列表,如下所述 假设我有一个Person对象的超级列表,如下所示:使用Java流从超集获取子集,java,list,arraylist,java-8,java-stream,Java,List,Arraylist,Java 8,Java Stream,我需要从给定的超级列表中获取子列表,如下所述 假设我有一个Person对象的超级列表,如下所示: List<Person> personsList = new ArrayList<>(); personsList.add(new Person("John", 28)); personsList.add(new Person("Paul", 29)); personsList.add(new Person("Adam", 30)); personsList.add(new
List<Person> personsList = new ArrayList<>();
personsList.add(new Person("John", 28));
personsList.add(new Person("Paul", 29));
personsList.add(new Person("Adam", 30));
personsList.add(new Person("Peter", 31));
personsList.add(new Person("Pat", 32));
class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + ": " + age;
}
}
给出如下子列表:
String [] names = {"John", "Paul", "Adam"};
List<String> namesList = Arrays.asList(names);
Set<String> namesList = new HashSet<> (Arrays.asList("John", "Paul", "Adam"));
List<Person> finalList = personsList.stream()
.filter(p -> namesList.contains(p.name))
.collect(Collectors.toList());
我得到了期望的结果,但我想知道是否有其他有效的方法来实现这一点,我主要是看namesList.containsp.name有点低效
如果有更好的方法,请告诉我。将名称列表定义为一个集合将更有效,尽管如果列表仅包含3个名称,差异不会太明显
比如说:
String [] names = {"John", "Paul", "Adam"};
List<String> namesList = Arrays.asList(names);
Set<String> namesList = new HashSet<> (Arrays.asList("John", "Paul", "Adam"));
List<Person> finalList = personsList.stream()
.filter(p -> namesList.contains(p.name))
.collect(Collectors.toList());
注意:我还将收集器更改为toList,因为这显然是您所需要的。将名称列表定义为一个集合将更有效,尽管如果列表仅包含3个名称,则差异不会太明显
比如说:
String [] names = {"John", "Paul", "Adam"};
List<String> namesList = Arrays.asList(names);
Set<String> namesList = new HashSet<> (Arrays.asList("John", "Paul", "Adam"));
List<Person> finalList = personsList.stream()
.filter(p -> namesList.contains(p.name))
.collect(Collectors.toList());
注意:我还将收集器更改为toList,因为您显然需要它。假设数组中有重复的名称没有意义,最好的方法是在一组名称中查找名称。这很容易实现。一旦数组接受任何集合,就将其转换为列表并包含在的构造函数中
String [] names = {"John", "Paul", "Adam"};
Set<String> set = new HashSet<>(Arrays.asList(names));
结果将只包含John、Paul和Adam persons的对象。假设数组中有重复的名称没有意义,最好的方法是在一组名称中查找名称。这很容易实现。一旦数组接受任何集合,就将其转换为列表并包含在的构造函数中
String [] names = {"John", "Paul", "Adam"};
Set<String> set = new HashSet<>(Arrays.asList(names));
结果将只包含John、Paul和Adam persons的对象。谢谢@Nikolas。所以,我使用contains的基本想法仍然很好,尽管我可以使用Collectors.toList。另外,我认为你的答案中说结果只包含Peter和Pat person对象是错误的?我已经编辑过了。这当然是我的错Stream::filter返回一个包含与给定谓词匹配的元素的流。谢谢@Nikolas。所以,我使用contains的基本想法仍然很好,尽管我可以使用Collectors.toList。另外,我认为你的答案中说结果只包含Peter和Pat person对象是错误的?我已经编辑过了。这当然是我的错Stream::filter返回一个流,其中包含与给定谓词匹配的元素。谢谢@assylias。所以,我使用contains的基本想法仍然很好,尽管我可以使用Collectors.toList。谢谢@assylias。所以,我使用contains的基本想法仍然很好,尽管我可以使用Collectors.toList。