
Oracle公司于2014年3月18日发布 Java8 。
支持Lambda表达式。
函数式接口。
新的Stream API。
新的日期 API。
Lambda 表达式,特殊的匿名内部类,语法更简洁。Lambda 表达式允许把函数作为一个方法的参数,将代码像数据一样传递。
Runnable 匿名内部类写成 Lambda 形式。
public class Test1 {
public static void main(String[] args) {
//匿名内部类:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("子线程1...");
}
});
thread.start();
//lambda表达式:
Thread thread2 = new Thread(()->System.out.println("子线程2...."));
thread2.start();
}
}
Lambda 表达式注意事项。
形参列表的数据类型会自动推断。
如果形参列表为空,只需保留() 。
如果形参只有1个,()可以省略,只需要参数的名称即可。
如果执行语句只有一句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有一句。
Lambda不会生成一个单独的内部类文件。
函数式接口。如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上 。@FunctionalInterface 注解检测接口是否符合函数式接口。
自定义函数式接口写成 Lambda 形式。
//定义函数式接口,里面只允许一个抽象方法
@FunctionalInterface
interface USB{
public void connect();
}
public class Test2 {
public static void main(String[] args) {
//匿名内部类:
USB usb = new USB() {
@Override
public void connect() {
System.out.println("匿名内部类的执行...");
}
};
usb.connect();
//lambda表达式
USB usb2 = ()->System.out.println("9999...");
usb2.connect();
}
}
常见函数式接口。
Consumer ,消费型接口。void accept(T t);对类型为T的对象应用操作。
Supplier,供给型接口。T get(); 返回类型为T的对象。
Function<T,R>,函数型接口。R apply(T t);对类型为T的对象应用操作,并返回类型为R类型的对象。
Predicate,断言型接口。boolean test(T t);确定类型为T的对象是否满足条件,并返回boolean类型。
public class Test1 {
public static void main(String[] args) {
Consumer<Integer> con = new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println("获取消费金额:"+t);
}
};
con.accept(100000);
//lambda表达式
//消费型接口: 有参数,无返回值
Consumer<Integer> con2 = s->System.out.println("获取消费金额:"+s);
con2.accept(9999);
//供给型接口:无参数,有返回值
Supplier<Integer> sup = ()->new Random().nextInt(9); //获取随机值0-8
System.out.println(sup.get());
//函数型接口: 有参数,有返回值
Function<String, String> fun = s->s.toUpperCase();
System.out.println(fun.apply("abcde"));
//断言型接口:有参数,返回值为boolean
Predicate<Integer> pro = s->s>0;
System.out.println(pro.test(1));
}
}
函数式接口的应用案例。将断言型接口做为方法参数做字符串过滤的判断。
public class Test1 {
public Test1() {
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
list.add("lisi1");
list.add("lisi2");
list.add("zhangsan1");
list.add("zhangsan2");
list.add("wangwu1");
// 普通方法
System.out.println(filer1(list));
System.out.println(filer2(list));
// 函数式接口做为方法参数,一个方法可实现多个判断方式
System.out.println(filerLambda(list, s -> s.length() > 5));
System.out.println(filerLambda(list, s -> s.startsWith("w")));
}
// Predicate 断言型接口,传入 lambda 表达式后,
// pre.test(string) 替换成 string.length() > 5
public static List<String> filerLambda (List<String> list, Predicate<String> pre) {
List<String> list1 = new ArrayList<String>();
for (String string : list) {
if (pre.test(string)) {
list1.add(string);
}
}
return list1;
}
public static List<String> filer1 (List<String> list) {
List<String> list1 = new ArrayList<String>();
for (String string : list) {
if (string.length() > 5) {
list1.add(string);
}
}
return list1;
}
public static List<String> filer2 (List<String> list) {
List<String> list1 = new ArrayList<String>();
for (String string : list) {
if (string.startsWith("w")) {
list1.add(string);
}
}
return list1;
}
}
本文详细介绍了Java8的重要更新,包括Lambda表达式的引入及其简洁的语法特性,如何使用Lambda表达式替代匿名内部类,以及函数式接口的概念。此外,还探讨了四种常见的函数式接口:Consumer、Supplier、Function和Predicate,并通过具体示例展示了这些接口的实际应用。


被折叠的 条评论
为什么被折叠?



