目录

Java-8-新特性Java-8-Stream通过filter方法筛选数据的示例

【Java 8 新特性】Java 8 Stream通过filter()方法筛选数据的示例

文章目录

在本页中,我们将提供 java 8 Stream filter() 示例。

它是一个中间操作,可以与 reduce()collect()map() 等一起使用。

我们为给定的 Predicate 实例过滤集合。

filter() 方法返回一个流实例,该实例只包含基于给定 Predicate 的筛选元素。

在本页中,我们将提供 filter() 的示例,它将过滤 List 。它也可以用于 ArrayMap 等。

Stream filter()

filter() 方法的语法如下。

filter(Predicate predicate)

它返回 Stream 的实例,该实例在处理 Predicate 后包含过滤后的数据。它被用作中间操作。 filter() 可用于许多不同的场景。

如果我们想根据任何条件筛选 list , arraymap ,我们可以使用 lambda 表达式和 stream filter() 方法在一行中轻松完成。

1. Stream filter()findFirst()orElse()forEach() 一起使用

在这里,我们将根据一些字符串过滤 User 对象的列表,然后我们将找到列表中的第一个元素,如果我们没有得到任何数据,那么我们将返回 null

FilterFindFirstAndForEach.java

package com.concretepage;
import java.util.List;
public class FilterFindFirstAndForEach {
	public static void main(String[] args) {
		List<User> list = User.getUsers();
		System.out.println("Using findFirst() ---");
		User user = list.stream().filter(u -> u.getName().endsWith("sh"))
				.findFirst().orElse(null);
		System.out.println(user.getName());
		System.out.println("Using forEach() ---");
		list.stream().filter(u -> u.getName().endsWith("sh"))
				.forEach(u -> System.out.println(u.getName()));
	}
} 

User.java

package com.concretepage;
import java.util.ArrayList;
import java.util.List;
public class User {
	private int id;
	private String name;
	private int age;
	public User(int id, String name, int age) {
		this.id = id; 
		this.name = name;
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	public static List<User> getUsers() {
		List<User> list = new ArrayList<User>();
		list.add(new User(1, "Dinesh", 20));
		list.add(new User(2, "Kamal", 15));
		list.add(new User(3, "Vijay", 25));
		list.add(new User(4, "Ramesh", 30));
		list.add(new User(5, "Mahesh", 18));
		return list;
	}
} 

输出

Using findFirst() ---
Dinesh
Using forEach() ---
Dinesh
Ramesh
Mahesh 

2. Stream filter()mapToInt()sum() 一起使用

代码如下,我们将过滤列表中给定用户id的范围,然后计算用户的年龄总和。

FilterMapToIntAndSum.java

package com.concretepage;
import java.util.List;
public class FilterMapToIntAndSum {
	public static void main(String[] args) {
		List<User> list = User.getUsers();
		System.out.println("--- Sum of age between the user id 2 and 4 ---");
		int sum = list.stream().filter(u -> u.getId() >= 2 && u.getId() <= 4)
				.mapToInt(u -> u.getAge()).sum();
		System.out.println("Sum: " + sum);
	}
} 

输出

--- Sum of age between the user id 2 and 4 ---
Sum: 70 

3. Stream filter()collect() 一起使用

这里我们过滤一个列表,然后计算元素的数量。

FilterAndCollect.java

package com.concretepage;
import java.util.List;
import java.util.stream.Collectors;
public class FilterAndCollect {
	public static void main(String[] args) {
		List<User> list = User.getUsers();
		long count = list.stream().filter(u -> u.getName().endsWith("sh"))
				.collect(Collectors.counting());
		System.out.println("Number of users ending name with 'sh': "+ count);
	}
} 

输出

Number of users ending name with 'sh': 3 

4. Stream filter()reduce() 一起使用

我们将计算名称与给定字符串匹配的用户的年龄总和。

FilterAndReduce.java

package com.concretepage;
import java.util.List;
public class FilterAndReduce {
	public static void main(String[] args) {
		List<User> list = User.getUsers();
		list.stream().filter(u -> u.getName().endsWith("sh"))
				.mapToInt(u -> u.getAge()).reduce((a, b) -> a + b)
				.ifPresent(s -> System.out.println("Sum of age of users ending name with 'sh': "+ s));
	}
} 

输出

Sum of age of users ending name with 'sh': 68 

5. Stream filter()List 中使用

这里有一个整数列表。我们将把列表过滤成偶数和奇数个列表。

FilterListOfInteger.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FilterListOfInteger {
	public static void main(String[] args) {
		List<Integer> list  = Arrays.asList(3, 12, 23, 44, 20, 10, 17, 8);
		System.out.println("---List with even Numbers---");
		List<Integer> evenList = list.stream().filter(i -> i%2 == 0)
				.collect(Collectors.toList());
		evenList.forEach(s -> System.out.print(s+" "));
		System.out.println("\n---List with odd Numbers---");
		List<Integer> oddList = list.stream().filter(i -> i%2 == 1)
				.collect(Collectors.toList());
		oddList.forEach(s -> System.out.print(s+" "));
	}
} 

输出

---List with even Numbers---
12 44 20 10 8 
---List with odd Numbers---
3 23 17  

参考文献