1. Lambda优于匿名内部类
- 函数接口:JDK 8中,只存在一个抽象方法的接口称为函数接口,使用
@FunctionalInterface
注解标识。 - 示例:
@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); }
- Lambda表达式:简化了匿名内部类的使用,使得代码更简洁。
list.sort((o1, o2) -> o2.compareTo(o1));
2. 善用方法引用
- 方法引用:比Lambda表达式更简洁,但有时过于简洁可能会降低可读性。
- 示例:
list.sort(Comparator.reverseOrder());
3. 坚持使用标准函数接口
- 标准函数接口:JDK 8的
java.util.function
包提供了多种标准函数接口,如Predicate
、Supplier
、Consumer
和Function
。Predicate<T>
:返回布尔类型,判断输入参数是否满足条件。Supplier<T>
:不传参,提供一个结果。Consumer<T>
:传入参数不返回。Function<T, R>
:传入T类型,响应R类型。
- 示例:
Predicate<Integer> isEven = n -> n % 2 == 0; Supplier<Integer> randomIntSupplier = () -> (int) (Math.random() * 100); Consumer<String> printer = message -> System.out.println(message); Function<String, String> getLastName = name -> name.split(" ")[1];
4. 谨慎使用Stream
- 流式处理:JDK 8引入的Stream API,通过多重管道处理集合,但滥用Stream会降低代码的可读性和维护性。
- 示例:
numbers.stream() .filter(isEven) .forEach(System.out::println);
5. 优先选择Stream中无副作用的函数
- 无副作用函数:如
filter
、map
、sorted
等,处理数据时不影响原集合。 - 示例:
List<String> list = Arrays.asList("aaa", "b", "cc"); List<Integer> lengths = list.stream() .map(String::length) .sorted() .collect(Collectors.toList());
6. Stream优先用Collection为返回类型
- 返回类型:使用
Collection
类型(如List
、Set
)作为返回类型,方便后续使用迭代或Stream。 - 示例:
List<String> lists = Arrays.asList(" 菜菜", " caicai ", "小菜 ", "", " "); Stream<String> stream = lists.stream() .filter(s -> !Objects.equals("", s.trim())) .map(s -> s.trim()); Collection<String> collect = stream.collect(Collectors.toCollection(ArrayList::new));
7. 谨慎使用Stream并行
- 并行处理:使用
parallel()
开启并行处理,可以提高处理速度,但需注意数据一致性问题。 - 示例:
static long piParallel(long n) { return LongStream.rangeClosed(2, n) .parallel() .mapToObj(BigInteger::valueOf) .filter(i -> i.isProbablePrime(50)) .count(); }
总结
- 函数接口:使用
@FunctionalInterface
注解,Lambda表达式实现简洁。 - 方法引用:简洁但需注意可读性。
- 标准函数接口:优先使用
java.util.function
提供的接口。 - Stream:简化代码,但需注意滥用问题。
- 无副作用函数:优先使用,处理完数据后再转换容器。
- 返回类型:优先使用
Collection
类型。 - 并行处理:提高速度,注意数据一致性。