[英]How to use java stream to filter object?
java中如何使用過濾器來過濾完整的對象。 我有一個包含name
和amount
的 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()
檢查該list
的person.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.