Java基础—— 匿名类函数式接口
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础—— 匿名类函数式接口相关的知识,希望对你有一定的参考价值。
Lambda
【匿名类】
Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。
常见有匿名类实现接口:
new Thread(new Runnable() {
@Override
public void run() {
}
});
注意接口在Java8之后提供了方法实现,即被default关键词修饰的方法。但是default方法不被认为是接口的方法,即在Lambda表达式 时不算在内。
口诀: 拷贝小括号 写死右箭头 落地大括号
Supplier函数式接口
使用Supplier传参可以减少代码的浪费执行,只有有必要时才执行。
package com.lambda;
import java.util.function.Supplier;
public class SupplierDemo {
public static String getFirstString(String s1, Supplier<String> s2Supplier){
if( s1 != null && s1.length() > 0) return s1;
//只有当s1为null时才通过Supplier函数式接口调用生成s2的方法
String s2 = s2Supplier.get();
if( s2 != null && s2.length() > 0) return s2;
return null;
}
public static void main(String[] args) {
System.out.println(getFirstString("", new Supplier<String>() {
public String get() {
return makeString();
}
})
);
//lambda表达式 写法
System.out.println(getFirstString("",() -> makeString()));
}
private static String makeString() {
System.out.println("makeString ……");
return String.format("%d %s", 1, "hello");
}
}
Consumer
package com.lambda;
import java.util.function.Consumer;
public class ConsumerDemo {
public static void forEach(int nums[], Consumer<Integer> consumer){
if( nums == null || consumer == null) return;
for(Integer num: nums){
//该函数式接口接受num
consumer.accept(num);
}
}
public static void main(String[] args) {
int nums[] = {1, 2, 3, 4, 5};
forEach(nums, new Consumer<Integer>() {
//接收到这里
@Override
public void accept(Integer integer) {
System.out.println(integer + 10);
}
});
//lambda 写法
forEach(nums,integer -> System.out.println(integer + 10));
}
}
Consumer then
相当于 c1.accept(n) ,c2.accept(n)
predict
test() 传判断表达式。
predicate and
两个表达式都要满足。
以上是关于Java基础—— 匿名类函数式接口的主要内容,如果未能解决你的问题,请参考以下文章