ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());
java的语法糖机制可以确定new出来的对象是ArrayList<>()是ArrayList<String>,java中可以直接传递泛型,确定泛型,同时hutool的这个方法也认可这个机制
// 1. 定义一个方法,它的参数是一个“函数”(实际上是函数式接口对象)
public static List<String> filterStrings(List<String> list, Predicate<String> predicate) {
List<String> result = new ArrayList<>();
for (String s : list) {
if (predicate.test(s)) { // 这里调用传入的“行为”进行判断
result.add(s);
}
}
return result;
}
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "David", "Charlie");
// 2. 调用这个方法,并直接传入一个Lambda表达式作为“判断逻辑”
// 这个Lambda就是 Predicate<String> 类型的参数
// 过滤出长度大于4的名字
List<String> longNames = filterStrings(names, (String s) -> s.length() > 4);
System.out.println(longNames); // [Alice, David, Charlie]
// 过滤出以"A"开头的名字 (另一个不同的“行为”)
List<String> startWithA = filterStrings(names, s -> s.startsWith("A"));
System.out.println(startWithA); // [Alice]
}
Lambda 表达式是依据函数式接口快速创建的匿名实现类实例。它本质上是一个对象,但因为其唯一的目的就是实现那个抽象方法,所以我们可以忽略其“对象”的外壳,而直接关注其“函数”的行为。这使得我们可以将代码(行为)作为一种轻量级的数据进行存储和传递,极大地提升了Java语言的表达力,尤其是在集合操作和异步编程中。