Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java流从超集获取子集_Java_List_Arraylist_Java 8_Java Stream - Fatal编程技术网

使用Java流从超集获取子集

使用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

我需要从给定的超级列表中获取子列表,如下所述

假设我有一个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 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。