Java Stream API中的函数
Java Stream API 是 Java 8 引入的一种新的 API,它主要用于在集合、数组等数据源中进行函数式操作。Java Stream API 中最常用的操作是函数,这些函数被称为 “函数式接口”,Java Stream API 中提供了多种不同类型的函数式接口,每一种接口都有不同的功能,下面我们来介绍一些常用的函数式接口。
1. Predicate
在 Java Stream API 中, Predicate 是一个函数式接口,它的类型是: Predicate<T>,用于当做一些判断条件。Predicate 接口中有一个抽象方法 test(),该方法的返回值是 boolean 类型。test() 方法返回 true 表示满足条件,false 表示不满足条件。
例子:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Predicate<Integer> predicate = x -> x > 3;
numbers.stream().filter(predicate).forEach(System.out::println);
2. Function
在 Java Stream API 中,Function 是一个函数式接口,它的类型是: Function<T, R>,用于将一个值转换成另一个值。Function 接口中有一个抽象方法 apply(),该方法接收一个 T 类型的参数,返回一个 R 类型的参数。
例子:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Function<Integer, Integer> function = x -> x * 2;
numbers.stream().map(function).forEach(System.out::println);
3. Consumer
在 Java Stream API 中,Consumer 是一个函数式接口,它的类型是: Consumer<T>,用于对集合中的元素进行操作。Consumer 接口中有一个抽象方法 accept(),该方法接收一个 T 类型的参数,没有返回值。
例子:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Consumer<Integer> consumer = x -> System.out.println(x);
numbers.stream().forEach(consumer);
4. Supplier
在 Java Stream API 中,Supplier 是一个函数式接口,它的类型是: Supplier<T>,用于生成一些值。Supplier 接口中有一个抽象方法 get(),该方法没有参数,返回一个 T 类型的值。
例子:
List<Integer> numbers = Stream.generate(() -> new Random().nextInt(100)).limit(10).collect(Collectors.toList());
Supplier<Integer> supplier = () -> Collections.max(numbers);
System.out.println(supplier.get());
5. BinaryOperator
在 Java Stream API 中,BinaryOperator 是一个函数式接口,它的类型是: BinaryOperator<T>,用于将两个值进行运算。BinaryOperator 接口中有一个抽象方法 apply(), 该方法接收两个 T 类型的参数,并返回一个 T 类型的值。
例子:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
BinaryOperator<Integer> binaryOperator = (x, y) -> x * y;
System.out.println(numbers.stream().reduce(binaryOperator).get());
6. UnaryOperator
在 Java Stream API 中,UnaryOperator 是一个函数式接口,它的类型是: UnaryOperator<T>,它是 Function 子接口的一种,UnaryOperator 接口的特点是它的输入参数类型和输出参数类型一致。UnaryOperator 接口中有一个抽象方法 apply(), 该方法接收一个 T 类型的参数,并返回一个 T 类型的值。
例子:
UnaryOperator<String> unaryOperator = x -> x.toUpperCase();
System.out.println(unaryOperator.apply("hello, world"));
7. BiFunction
在 Java Stream API 中,BiFunction 是一个函数式接口,它的类型是: BiFunction<T, U, R>,用于将两个值转换成另一个值。BiFunction 接口中有一个抽象方法 apply(),该方法接收一个 T 类型的参数和一个 U 类型的参数,返回一个 R 类型的参数。
例子:
Map<Integer, String> map = new HashMap<>();
map.put(1, "One");
map.put(2, "Two");
BiFunction<Integer, String, String> biFunction = (key, value) -> value.toUpperCase();
map.replaceAll(biFunction);
System.out.println(map);
8. BiConsumer
在 Java Stream API 中,BiConsumer 是一个函数式接口,它的类型是: BiConsumer<T, U>,用于对集合中的两个元素进行操作。BiConsumer 接口中有一个抽象方法 accept(),该方法接收一个 T 类型的参数和一个 U 类型的参数,没有返回值。
例子:
Map<Integer, String> map = new HashMap<>();
map.put(1, "One");
map.put(2, "Two");
BiConsumer<Integer, String> biConsumer = (key, value) -> System.out.println(key + ": " + value.toUpperCase());
map.forEach(biConsumer);
9. IntPredicate
在 Java Stream API 中,IntPredicate 是一个函数式接口,它的类型是: IntPredicate,用于当做一些判断条件。IntPredicate 接口中有一个抽象方法 test(),该方法的返回值是 boolean 类型。test() 方法接收一个 int 类型的参数,返回 true 表示满足条件,false 表示不满足条件。
10. IntFunction
在 Java Stream API 中,IntFunction 是一个函数式接口,它的类型是: IntFunction<R>,用于将一个 int 值转换成另一个值。IntFunction 接口中有一个抽象方法 apply(),该方法接收一个 int 类型的参数,返回一个 R 类型的参数。
这些是 Java Stream API 中常用的一些函数式接口,使用这些函数可以让我们更加方便地进行集合、数组等数据源的操作,提高我们的代码效率。
