一、函数式接口的定义
函数式接口是指只包含一个抽象方法的接口。在Java8之前,Java接口只能包含静态常量和抽象方法。而从Java8开始,Java增加了新特性lambda表达式,使得可以直接通过lambda表达式来传递函数。
二、Lambda表达式的基本语法
Lambda表达式语法格式如下:
(parameter1, parameter2,...) -> { statement1; statement2; ... }
其中,参数可以为空或者多个,并且参数类型可以省略。Lambda表达式中间用“->”符号连接参数和函数体。
三、函数式接口的使用
1. Consumer函数式接口
Consumer函数式接口表示一个接受单个参数并且没有返回值的操作。例如:
Consumerconsumer = (String str) -> { System.out.println(str); }; consumer.accept("hello");
上述代码会输出"hello"字符串。
2. Supplier函数式接口
Supplier函数式接口表示一个不接受参数但是返回结果的操作。例如:
Suppliersupplier = () -> { return "hello"; }; String result = supplier.get(); System.out.println(result);
上述代码会输出"hello"字符串。
3. Function函数式接口
Function函数式接口表示一个接受一个参数并且返回结果的操作。例如:
Functionfunction = (String str) -> { return str.length(); }; int length = function.apply("hello"); System.out.println(length);
上述代码会输出字符串"hello"的长度5。
4. Predicate函数式接口
Predicate函数式接口表示一个接受一个参数并且返回一个bool类型结果的判断操作。例如:
Predicatepredicate = (Integer num) -> { return num > 0; }; boolean result = predicate.test(10); System.out.println(result);
上述代码会输出true。
5. BiConsumer函数式接口
BiConsumer函数式接口表示一个接受两个参数并且没有返回值的操作。例如:
BiConsumerbiConsumer = (Integer num1, Integer num2) -> { System.out.println(num1 + num2); }; biConsumer.accept(2, 3);
上述代码会输出5。
四、函数式接口的实际应用场景
函数式接口在实际应用中可以用于以下场景:
1. 去除集合中的重复元素
使用Stream和Lambda表达式可以简单地从集合中去除重复的元素。例如:
Setset = new HashSet<>(Arrays.asList("a", "b", "c", "b")); List distinctList = set.stream().distinct().collect(Collectors.toList()); System.out.println(distinctList); // [a, b, c]
2. 排序
使用Stream和Comparator接口可以进行集合中元素的排序。例如:
Listnumbers = Arrays.asList(3, 1, 4, 2, 5); List sortedNumbers = numbers.stream().sorted().collect(Collectors.toList()); System.out.println(sortedNumbers); // [1, 2, 3, 4, 5]
3. 筛选
使用Stream和Predicate接口可以进行集合中元素的筛选。例如:
Listnumbers = Arrays.asList(3, 1, 4, 2, 5); List evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()); System.out.println(evenNumbers); // [4, 2]
4. 映射
使用Stream和Function接口可以进行集合中元素的映射。例如:
Listwords = Arrays.asList("apple", "banana", "orange"); List wordLengths = words.stream().map(String::length).collect(Collectors.toList()); System.out.println(wordLengths); // [5, 6, 6]
5. 并行计算
使用Stream和parallel方法可以进行并行计算。例如:
Listnumbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum(); System.out.println(sum); // 15
五、总结
通过本文的介绍,我们了解了Java8中的函数式接口及其实际应用场景。利用函数式接口结合Lambda表达式可以大大简化代码的编写,并且提高代码的可读性和可维护性。