前言
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));
}
}
运行结果