函数式接口 = 只能有一个抽象方法的接口
Lambda 表达式必须赋值给一个函数式接口,比如 Java 8 自带的:
接口名 作用
Function
Consumer 传入 T 类型,无返回(只执行)
Supplier 不传参,返回 T 类型值
Predicate 传入 T 类型,返回布尔(true/false)
核心理解:
Lambda 表达式只能赋值或传入“函数式接口(Functional Interface)”类型的变量或参数。
所以当你在方法中想要传入一个 Lambda 表达式作为参数时,方法的参数类型必须是某个函数式接口类型,否则 编译器不知道这个函数的签名该怎么对照,就会报错。
例 1:使用 Function
java
复制
编辑
public static String transform(String input, Function
return transformer.apply(input);
}
// 调用时传入 Lambda 表达式:
String result = transform(“java”, s -> s.toUpperCase());
System.out.println(result); // JAVA
例 2:使用 Predicate 做条件判断
public static boolean check(String str, Predicate condition) {
return condition.test(str);
}
boolean isLong = check(“hello”, s -> s.length() > 3);
例 3:使用 Consumer 执行操作
public static void greet(String name, Consumer greeter) {
greeter.accept(name);
}
greet(“Jack”, s -> System.out.println("Hello " + s));
例 4:使用 Supplier 获取值
public static String getRandom(Supplier supplier) {
return supplier.get();
}
String value = getRandom(() -> UUID.randomUUID().toString());
如果你不指定这些接口(也就是函数式接口),Lambda 就没法传入!
比如这会报错:
public void doSomething(Object handler) {
// …
}
doSomething(x -> x + 1); // ❌ 编译错误:Object 不是函数式接口
List 是一个顺序的集合,其中的每个元素都只是一个值。在流式操作中,流传递的就是这些值。
ageMap.entrySet()
.stream()
.map(entry -> entry.getKey() + " is " + entry.getValue() + " years old.")
.forEach(System.out::println);
.stream()
中间操作是链式调用的操作,它们不会立即执行,而是会“懒执行”直到遇到终结操作。
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List result = numbers.stream()
.filter(x -> x > 3) // 只保留大于 3 的数字
.collect(Collectors.toList());
System.out.println(result); // 输出 [4, 5, 6]
List names = Arrays.asList(“Tom”, “Jerry”, “Spike”);
List nameLengths = names.stream()
.map(String::length) // 转换每个名字为它的长度
.collect(Collectors.toList());
System.out.println(nameLengths); // 输出 [3, 5, 5]
List namesList = Arrays.asList(
Arrays.asList(“Tom”, “Jerry”),
Arrays.asList(“Spike”, “Tyke”)
);
List flattenedList = namesList.stream()
.flatMap(List::stream) // 把 List 变成一个单一的 Stream
.collect(Collectors.toList());
System.out.println(flattenedList); // 输出 [Tom, Jerry, Spike, Tyke]
List numbers = Arrays.asList(5, 3, 8, 1, 7);
List sortedNumbers = numbers.stream()
.sorted() // 默认升序排序
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出 [1, 3, 5, 7, 8]
自定义排序:
List names = Arrays.asList(“Tom”, “Jerry”, “Spike”);
List sortedNames = names.stream()
.sorted((a, b) -> b.compareTo(a)) // 降序排序
.collect(Collectors.toList());
System.out.println(sortedNames); // 输出 [Spike, Tom, Jerry]
List numbers = Arrays.asList(1, 2, 3, 2, 3, 4);
List distinctNumbers = numbers.stream()
.distinct() // 去除重复的元素
.collect(Collectors.toList());
System.out.println(distinctNumbers); // 输出 [1, 2, 3, 4]
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List limitedNumbers = numbers.stream()
.limit(3) // 只保留前 3 个元素
.collect(Collectors.toList());
System.out.println(limitedNumbers); // 输出 [1, 2, 3]
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List skippedNumbers = numbers.stream()
.skip(3) // 跳过前 3 个元素
.collect(Collectors.toList());
System.out.println(skippedNumbers); // 输出 [4, 5, 6]
终结操作会触发流的计算并最终返回一个结果,或者是将流的内容收集到一个集合中。终结操作执行时会迫使 Stream 中的中间操作开始工作。
List numbers = Arrays.asList(1, 2, 3, 4, 5);
List result = numbers.stream()
.filter(x -> x > 3)
.collect(Collectors.toList()); // 收集成一个 List
System.out.println(result); // 输出 [4, 5]
List names = Arrays.asList(“Tom”, “Jerry”, “Spike”);
names.stream()
.forEach(System.out::println); // 打印每个名字
List numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream()
.filter(x -> x > 3)
.count(); // 返回大于 3 的元素数量
System.out.println(count); // 输出 2
List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // 求和,初始值是 0
System.out.println(sum); // 输出 15
List numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean result = numbers.stream()
.anyMatch(x -> x > 4); // 判断是否有元素大于 4
System.out.println(result); // 输出 true
List numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean result = numbers.stream()
.allMatch(x -> x > 0); // 判断是否所有元素都大于 0
System.out.println(result); // 输出 true
List names = Arrays.asList(“Tom”, “Jerry”, “Spike”);
String firstName = names.stream()
.findFirst()
.orElse(“No Name”); // 如果流为空,返回 “No Name”
System.out.println(firstName); // 输出 Tom