本文共 5588 字,大约阅读时间需要 18 分钟。
概念:
如何检测一个接口是不是函数式接口呢?
注意事项:
概念:
需求:
实现:
public class RunnableDemo { public static void startThread(Runnable r) { new Thread(r).start(); } public static void main(String[] args) { startThread(() -> System.out.println(Thread.currentThread().getName() + "启动了")); }}
运行结果:
Thread-0启动了
概念:
需求:
实现:
public class ComparatorDemo { public static ComparatorgetComparator() { return ((o1, o2) -> o1.length() - o2.length()); } public static void main(String[] args) { List list = new ArrayList<>(); list.add("aa"); list.add("b"); list.add("cc"); list.add("dddd"); Collections.sort(list, getComparator()); System.out.println(list); }}
运行结果:
[b, aa, cc, dddd]
Java 8 在 java.util.function 包下预定义了大量的函数式接口供我们使用,我们重点来学习下面的 4 个接口:
概念:
常用方法:
只有一个无参的方法
方法名 | 说明 |
---|---|
T get() | 它会按照某种实现逻辑(由 Lambda 表达式实现)返回一个数据 |
需求:
实现:
public class SupplierTest { public static int getMax(Suppliersup) { return sup.get(); } public static void main(String[] args) { int[] arr = { 1, 6, 4, 9, 3}; int maxValue = getMax(() -> { int max = arr[0]; for (int i : arr) { if (i > max) { max = i; } } return max; }); System.out.println(maxValue); }}
运行结果:
9
概念:
常用方法:
Consumer:包含两个方法
方法名 | 说明 |
---|---|
void accept(T t) | 对给定的参数执行此操作 |
default Consumer andThen(Consumer after) | 返回一个组合的 Consumer,依次执行此操作,然后执行 after 操作 |
需求:
实现:
public class ConsumerTest { public static void printInfo(String[] strs, Consumercon1, Consumer con2) { for (String str : strs) { /** * 下面一行代码等同于: * con1.accept(str); * con2.accept(str); */ con1.andThen(con2).accept(str); } } public static void main(String[] args) { String[] strArray = { "林青霞,30", "张曼玉,35", "王祖贤,33"}; printInfo(strArray, str -> System.out.print("name:" + str.split(",")[0]), str -> System.out.println(" age:" + str.split(",")[1]) ); }}
运行结果:
name:林青霞 age:30name:张曼玉 age:35name:王祖贤 age:33
概念:
常用方法:
方法名 | 说明 |
---|---|
boolean test(T t) | 对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值 |
default Predicate negate() | 返回一个逻辑的否定,对应逻辑非 |
default Predicate and(Predicate other) | 返回一个组合判断,对应短路与 |
default Predicate or(Predicate other) | 返回一个组合判断,对应短路或 |
需求:
实现:
public class PredicateTest { public static ListmyFilter(String[] strs, Predicate predicate1, Predicate predicate2) { ArrayList list = new ArrayList<>(); for (String str : strs) { if (predicate1.and(predicate2).test(str)) { list.add(str); } } return list; } public static void main(String[] args) { String[] strArray = { "林青霞,30", "柳岩,34", "张曼玉,35", "貂蝉,31", "王祖贤,33"}; List list = myFilter(strArray, str -> str.split(",")[0].length() > 2, str -> Integer.valueOf(str.split(",")[1]) > 33 ); System.out.println(list); }}
运行结果:
[张曼玉,35]
概念:
常用方法:
方法名 | 说明 |
---|---|
R apply(T t) | 将此函数应用于给定的参数 |
default Function andThen(Function after) | 返回一个组合函数,首先将该函数应用于输入,然后将 after 函数应用于结果 |
需求:
实现:
public class FunctionTest { public static void covert(String str, Functionfun1, Function fun2, Function fun3) { Integer num = fun1.andThen(fun2).andThen(fun3).apply(str); System.out.println(num); } public static void main(String[] args) { String s = "林青霞,30"; covert(s, str -> str.split(",")[1], ageStr -> Integer.valueOf(ageStr), age -> age + 70 ); }}
运行结果:
100
转载地址:http://yfjvb.baihongyu.com/