Java中的函数运算符和方法引用
函数运算符(functional operators)是Java 8中引入的新特性。它们可以将lambda表达式转化为一个具有某些操作的对象,以便在程序中重复使用。这些操作通常是像过滤、排序、映射和规约这样的集合操作。
常见的函数运算符有:filter、map、reduce、foreach、sorted、distinct等。
filter函数运算符
在Java 8中,可以使用filter函数运算符从集合中获取符合条件的元素。它接受一个Predicate<T>类型的参数,即一个lambda表达式,该表达式的输入是集合中的元素,输出是一个boolean类型。
例如,假设有一个整数列表,需要过滤出所有大于10的元素:
List<Integer> numbers = Arrays.asList(1, 5, 10, 15, 20);
List<Integer> filteredNums = numbers.stream()
.filter(n -> n > 10)
.collect(Collectors.toList());
System.out.println(filteredNums);
输出结果为:[15, 20]
map函数运算符
map函数运算符可以用于将集合中的元素进行转换。它接受一个Function<T,R>类型的参数,即一个lambda表达式,该表达式的输入是集合中的元素,输出是转换后的新元素。
例如,可以使用map将一个字符串列表转换为对应的长度列表:
List<String> words = Arrays.asList("Java", "C", "Python", "Javascript");
List<Integer> wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(wordLengths);
输出结果为:[4, 1, 6, 10]
reduce函数运算符
reduce函数运算符可以用于将集合中的所有元素归约为一个单一的值。它接受一个BinaryOperator<T>类型的参数,即一个lambda表达式,该表达式的输入是两个元素,输出是一个单一的值。
例如,可以使用reduce将一个整数列表中的所有元素相加:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, (a, b) -> a + b);
System.out.println(sum);
输出结果为:15
foreach函数运算符
foreach函数运算符可以用于对集合中的元素进行遍历。它接受一个Consumer<T>类型的参数,即一个lambda表达式,该表达式的输入是集合中的元素,无输出。
例如,可以使用foreach输出一个字符串列表中的每个元素:
List<String> words = Arrays.asList("Java", "C", "Python", "Javascript");
words.forEach(System.out::println);
输出结果为:
Java
C
Python
Javascript
sorted函数运算符
sorted函数运算符可以用于对集合中的元素进行排序。它接受一个Comparator<T>类型的参数,即一个lambda表达式,该表达式的输入是两个元素,输出是一个可以比较的整数值。
例如,可以使用sorted对一个字符串列表按照长度进行升序排序:
List<String> words = Arrays.asList("Java", "C", "Python", "Javascript");
List<String> sortedWords = words.stream()
.sorted((s1, s2) -> Integer.compare(s1.length(), s2.length()))
.collect(Collectors.toList());
System.out.println(sortedWords);
输出结果为:[C, Java, Python, Javascript]
distinct函数运算符
distinct函数运算符可以用于对集合中的元素进行去重。它会保留第一个出现的元素,后续的相同元素会被去除。它不需要参数。
例如,可以使用distinct对一个整数列表进行去重:
List<Integer> numbers = Arrays.asList(1, 2, 3, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());
System.out.println(distinctNumbers);
输出结果为:[1, 2, 3, 4, 5]
方法引用
在Java 8中,lambda表达式可以与方法引用(method reference)一起使用,以便更加简洁地表示一些操作。方法引用的语法形式为:Class::method
方法引用分为四类:
- 静态方法引用:Class::staticMethod
- 实例方法引用:instance::method
- 构造方法引用:Class::new
- 数组引用:Type[]::new
例如,可以使用方法引用将一个字符串列表按照长度进行升序排序:
List<String> words = Arrays.asList("Java", "C", "Python", "Javascript");
List<String> sortedWords = words.stream()
.sorted(Comparator.comparing(String::length))
.collect(Collectors.toList());
System.out.println(sortedWords);
输出结果为:[C, Java, Python, Javascript]
方法引用也可以与lambda表达式结合使用,例如:
List<String> words = Arrays.asList("Java", "C", "Python", "Javascript");
List<String> upperWords = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperWords);
输出结果为:[JAVA, C, PYTHON, JAVASCRIPT]
总结:
函数运算符和方法引用是Java 8中非常有用的新特性,它们可以方便地对集合进行操作和转换。熟练掌握这些特性可以提高Java程序的效率和可读性。
