stream().filter匹配过滤总结
前言
Java集合Stream 出自 Java8。 可谓是加量不加价,丰富了使用场景,还精简了代码。虽然牺牲了一点可读性,但总体来说是很好用的。以下总结其中 filter 的一些用法,整理相关的例子。
以下是几种场景
一、简单匹配过滤
简单对象
public class TestFilter { public static void main(String[] args) { List<String> list = Arrays.asList("AAB","BBB","ACC"); System.out.println("过滤相等-------------------------------------------"); List<String> result1 = list.stream().filter(v -> v.equals("AAB")).collect(Collectors.toList()); result1.forEach(v-> System.out.println(v)); System.out.println("过滤 模糊相等(包含)-------------------------------------------"); List<String> result2 = list.stream().filter(v -> v.contains("B")).collect(Collectors.toList()); result2.forEach(v-> System.out.println(v)); System.out.println("多条件 过滤 与:&&; 或||-------------------------------------------"); List<String> result3 = list.stream().filter(v -> v.contains("A") && v.contains("C")).collect(Collectors.toList()); result3.forEach(v-> System.out.println(v)); } }
运行结果 可见,filter支持单条件,多条件组合匹配过滤
二、对象匹配过滤
假设对象
public class User { /** 名称 */ private String name; /** 年龄 */ private Integer age; }
例子
public class TestFilter1 { public static void main(String[] args) { List<User> userList = new ArrayList<>(); userList.add(new User("小明", 18)); userList.add(new User("王姐", 21)); System.out.println("过滤相等-------------------------------------------"); List<User> result1 = userList.stream().filter(v -> v.getName().equals("小明")).collect(Collectors.toList()); result1.forEach(v-> System.out.println(v)); } }
运行结果
三、自定义匹配过滤
看看filter接口的源码
public interface Stream<T> extends BaseStream<T, Stream<T>> { /** * Returns a stream consisting of the elements of this stream that match * the given predicate. * * <p>This is an <a href="package-summary.html#StreamOps">intermediate * operation</a>. * * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>, * <a href="package-summary.html#Statelessness">stateless</a> * predicate to apply to each element to determine if it * should be included * @return the new stream */ Stream<T> filter(Predicate<? super T> predicate);
可以看到,filter接收的参数是Predicate,这是一个布尔接口,用于各种匹配,所以自定义filter实际上我们是你把Predicate的用法丰富起来 比如:
public class TestFilter1 { public static void main(String[] args) { List<User> userList = new ArrayList<>(); userList.add(new User("小明", 18)); userList.add(new User("王姐", 21)); System.out.println("过滤相等-------------------------------------------"); List<User> result2 = userList.stream().filter(new Predicate<User>() { @Override public boolean test(User user) { if (user.getAge() > 18) { return true; }else{ return false; } } }).collect(Collectors.toList()); result2.forEach(v-> System.out.println(v)); } }
运行结果