前言Java函数式编程,是一种强大的编程范式,能够让你的代码更加简洁,优雅。Java 8 引入了函数式编程的支持,其中Lambda表达式和函数式接口是函数式编程的两个重要概念。在本篇文章中,我们将会详细介绍Java函数式编程以及常用的函数式接口。
Lambda表达式
Lambda表达式是一种匿名函数,可以理解为一段可以传递的代码。在 Java 中,Lambda 表达式可以替代只有一个抽象方法的接口。下面是一个Lambda表达式的例子:
() -> System.out.println("Hello World")
其中,左侧括号内是Lambda表达式的参数列表(如果没有参数,则为空),箭头“->”将 Lambda 表达式的参数列表和表达式主体分隔开,右侧则是Lambda表达式的主体(也就是Lambda表达式要执行的代码块)。Lambda表达式是使用编写函数式接口的简便方法。
函数式接口
函数式接口是指仅包含一个抽象方法的接口。在 Java 中,函数式接口可以使用Lambda表达式来实现,从而实现函数式编程。Java提供了一些常用的函数式接口,如Function、Consumer、Predicate、Supplier等。
Function
public interface Function<T, R> { R apply(T t); }
Function接口接受一个参数并返回结果。我们可以使用andThen方法来将多个函数串联起来,进行组合操作。示例代码:
Function<Integer, String> intToString = Object::toString; Function<String, String> quote = s -> "'" + s + "'"; Function<Integer, String> quoteIntToString = intToString.andThen(quote); String result = quoteIntToString.apply(123); System.out.println(result);
Consumer
public interface Consumer<T> { void accept(T t); }
Consumer接口接受一个参数,但没有返回值。我们可以使用andThen方法来将多个Consumer组合起来,进行链式操作。示例代码:
List<String> list = Arrays.asList("a", "b", "c"); Consumer<String> print = System.out::print; Consumer<String> println = System.out::println; list.forEach(print.andThen(println));
Predicate
public interface Predicate<T> { boolean test(T t); }
Predicate接口接受一个参数,返回一个布尔值。我们可以使用and、or、negate方法将多个Predicate组合起来,进行复合逻辑的判断。示例代码:
List<String> list = Arrays.asList("cat", "dog", "bird", "lion", "tiger"); Predicate<String> startsWithC = s -> s.startsWith("c"); Predicate<String> endsWithR = s -> s.endsWith("r"); Predicate<String> containsO = s -> s.contains("o"); list.stream() .filter(startsWithC.and(endsWithR).or(containsO)) .forEach(System.out::println);
Supplier
public interface Supplier<T> { T get(); }
Supplier接口不接受任何参数,返回一个结果。我们可以使用get方法来获取结果。示例代码:
Supplier<String> helloSupplier = () -> "Hello"; System.out.println(helloSupplier.get() + " world");
方法引用
方法引用是一种更简洁的Lambda表达式,可以通过方法名称来引用已经存在的方法。方法引用通过 :: 操作符将方法名与对象或类名分隔开来表示。
下面是一些方法引用的例子:
Function<String, Integer> strToInt = Integer::parseInt; Supplier<Date> newDate = Date::new; Consumer<String> print = System.out::print;
总结
在本篇文章中,我们介绍了Java函数式编程以及常用的函数式接口。Lambda表达式和函数式接口是函数式编程的两个重要概念,可以让代码更加简洁和灵活。Java提供了一些常用的函数式接口,如Function、Consumer、Predicate、Supplier等,可以通过方法引用更加简洁地实现函数式编程。使用函数式编程,可以让你的代码更加优雅,简洁。