簡體   English   中英

如何使用java流過濾對象?

[英]How to use java stream to filter object?

java中如何使用過濾器來過濾完整的對象。 我有一個包含nameamount的 ArrayList ,我有另一個包含一些字符串的字符串數組。

現在在這里如何過濾和創建一個新的 ArrayList,它只包含這兩個具有arr元素的對象。

我嘗試使用兩種方法.equals.contains但它不產生輸出。

List<Person> people = new ArayList<>();
people.add(new Person("Warren Buffett" , 90));
people.add(new Person("Jeff Bezos" , 180));
people.add(new Person("Bill Gates" , 140));
people.add(new Person("Mark" , 120));

String arr[]={"Mark" , "Bill Gates"};

List<Person> newPeople = people.stream().filter(person -> person.name.equals(arr))
List<Person> newPeople = people.stream().filter(person -> person.name.contains(arr)).collect(collectors.toList());

newPeople.forEach(person -> System.out.println(person.name));

編輯:

我應該將輸出作為一個對象的數組,該對象應該包含馬克和比爾蓋茨的名字及其數量

你不能做這個person.name.contains(arr) ,而你應該做person.name.contains(arr[0])person.name.contains(arr[1])
為此,您可能需要進行嵌套迭代。

您可以在下面找到工作解決方案。 使用流通過 args 數組進行迭代以查找第一個匹配的 arg。

List<Person> newPeople = people.stream()
            .filter(person -> Stream.of(arr).anyMatch(s -> person.name.equals(s)))
            .collect(Collectors.toList());



newPeople.forEach(person -> System.out.println(person.name));
// Bill Gates
// Mark

您可以將數組轉換為列表; 然后使用List.contains()檢查該listperson.name是否可用。

首先轉換數組。

String arr[]={"Mark" , "Bill Gates"};
List<String> names = Arrays.asList(arr);

現在,使用List.contains()

List<Person> newPeople 
   = people.stream().filter(
                             person -> names.contains(person.name)).collect(Collectors.toList()
                           );

以下是更新后的完整方法。

public static void main(String[] args) {

    List<Person> people = new ArrayList<>();
    people.add(new Person("Warren Buffett" , 90));
    people.add(new Person("Jeff Bezos" , 180));
    people.add(new Person("Bill Gates" , 140));
    people.add(new Person("Mark" , 120));

    String arr[]={"Mark" , "Bill Gates"};
    List<String> names = Arrays.asList(arr);

    List<Person> newPeople = people.stream().filter(person -> names.contains(person.name)).collect(Collectors.toList());

    newPeople.forEach(person -> System.out.println(person.name));

}

所以你想要一個只包含名字出現在 arr 中的 Person 實例的新列表? 嘗試這樣做:

List<Person> newPeople = people.stream()
    .filter(person -> arr.contains(person.name))
    .collect(collectors.toList());

lambda 變量“person”指的是包含在人員列表中的單個對象,而不是列表本身。 因此,當您使用 person.name.equals(...) 或 person.name.contains(...) 時,您是在字符串上調用這些方法。 反過來,就像我的例子一樣,會給你想要的結果; 如果沒有,讓我們知道,我們會挖北斗七星

編輯:

我假設 arr 是一個列表,因此在使用我的代碼之前,您應該考慮執行以下操作

List<String> names = Arrays.asList(arr);

進而

List<Person> newPeople = people.stream()
.filter(person -> names.contains(person.name))
.collect(collectors.toList());

假設您正在通過其他東西傳遞該數組,如果您正在創建它,您可以創建一個列表並跳過數組“步驟”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM