您的位置:

Java函数式接口实际使用

一、函数式接口的定义

函数式接口是指只包含一个抽象方法的接口。在Java8之前,Java接口只能包含静态常量和抽象方法。而从Java8开始,Java增加了新特性lambda表达式,使得可以直接通过lambda表达式来传递函数。

二、Lambda表达式的基本语法

Lambda表达式语法格式如下:

(parameter1, parameter2,...) -> { statement1; statement2; ... }

其中,参数可以为空或者多个,并且参数类型可以省略。Lambda表达式中间用“->”符号连接参数和函数体。

三、函数式接口的使用

1. Consumer函数式接口

Consumer函数式接口表示一个接受单个参数并且没有返回值的操作。例如:

Consumer consumer = (String str) -> { System.out.println(str); };
consumer.accept("hello");

  

上述代码会输出"hello"字符串。

2. Supplier函数式接口

Supplier函数式接口表示一个不接受参数但是返回结果的操作。例如:

Supplier supplier = () -> { return "hello"; };
String result = supplier.get();
System.out.println(result);

  

上述代码会输出"hello"字符串。

3. Function函数式接口

Function函数式接口表示一个接受一个参数并且返回结果的操作。例如:

Function function = (String str) -> { return str.length(); };
int length = function.apply("hello");
System.out.println(length);

  

上述代码会输出字符串"hello"的长度5。

4. Predicate函数式接口

Predicate函数式接口表示一个接受一个参数并且返回一个bool类型结果的判断操作。例如:

Predicate predicate = (Integer num) -> { return num > 0; };
boolean result = predicate.test(10);
System.out.println(result);

  

上述代码会输出true。

5. BiConsumer函数式接口

BiConsumer函数式接口表示一个接受两个参数并且没有返回值的操作。例如:

BiConsumer biConsumer = (Integer num1, Integer num2) -> { System.out.println(num1 + num2); };
biConsumer.accept(2, 3);

  

上述代码会输出5。

四、函数式接口的实际应用场景

函数式接口在实际应用中可以用于以下场景:

1. 去除集合中的重复元素

使用Stream和Lambda表达式可以简单地从集合中去除重复的元素。例如:

Set set = 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接口可以进行集合中元素的排序。例如:

List numbers = 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接口可以进行集合中元素的筛选。例如:

List numbers = 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接口可以进行集合中元素的映射。例如:

List words = 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方法可以进行并行计算。例如:

List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
System.out.println(sum); // 15

  

五、总结

通过本文的介绍,我们了解了Java8中的函数式接口及其实际应用场景。利用函数式接口结合Lambda表达式可以大大简化代码的编写,并且提高代码的可读性和可维护性。