函数式编程
面向对象强调“一切皆对象”,如果想要做事情,必须要找到对象来做。函数式编程思想强调“做什么”,而不是“怎么做”。
普通的开启线程
// 匿名内部类对象 Runnable task = new Runnable() { @Override public void run() { System.out.println("乌鸦坐飞机"); } }; new Thread(task).start();
更多java相关免费视频教程:java在线教程
函数式编程开启线程
new Thread(() -> System.out.println("龙卷风摧毁停车场")).start();
前面的小括号:方法参数,没有参数时就写(),箭头指向后面要做的事情,箭头后面就好比是方法体大括号,代表具体要做的内容。
Lambda表达式
Lambda表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。
三要素:参数、箭头 、代码
格式:(参数类型 参数名称) -> { 一些代码 }
使用Lambda表达式的前提:必须要有接口并且接口中有且只有一个抽象方法
演示:编写一个Cook接口,接口中有一个makeFood()方法
public static void main(String[] args) { method(() -> { System.out.println("闪刀启动!"); }); } private static void method(Cook cook) { cook.makeFood(); }
Lambda表达式省略规则:
参数类型可以省略。但是只能同时省略所有参数的类型,或者干脆都不省略如果参数有且仅有一个,那么小括号可以省略如果大括号内的语句有且仅有一个,那么无论有没有返回值,return、大括号、分号都可以省略。
public static void main(String[] args) { method((a, b)-> a + b); } private static void method(Calculator calculator) { int result = calculator.sum(1234, 9876); System.out.println(result); }
在new一个接口时,也可以使用lambda表达式来代替匿名内部类
Runnable task = () -> System.out.println("闪刀启动!"); new Thread(task).start();
函数式接口
接口当中有且仅有一个抽象方法,叫做函数式接口。
JDK8中新增了注解@FunctionalInterface
,用于检测一个接口是否为函数式接口。如果不是函数式接口,编译时会报错。@FunctionalInerface注解是可选的,就算不用这个注解,只要保证接口满足函数式接口的定义要求,也一样是函数式接口。
@FunctionalInterface public interface MyInterface { void method(); }
方法引用
Printer printer = (str) -> System.out.println(str);
这段代码实际上可以简写。
只要是可推导的,就是可引用的,因此传参其实并没有意义,因此这里其实可以使用方法引用来简写 System.out::println
从java8开始,引入了一个全新的运算符,方法引用符(两个冒号连着写),所在的表达式就是一个方法引用,方法引用和Lambda本质是完全一样的,目的就是简化Lambda表达式的写法。
Lambda的写法:s->System.out.println(s)
方法引用写法:System.out::println
两种写发完全等效
public static void main(String[] args) { method(System.out::println); } private static void method(Printer printer) { printer.print("hello"); }
接口
default方法
接口本来是两个抽象方法,现在需要变成三个抽象方法,这个时候它的实现类也需要实现新的方法。
当实现类太多时,操作起来很麻烦,JDK之前是使用开闭设计模式:对扩展开放,对修改关闭。即:创建一个新的接口,继承原有的接口,定义新的方法,但是这样的话,原本的那些实现类并没有新的方法,这时候可以使用接口默认方法。
关键字使用default进行修饰, 方法需要方法体。这样的方法所有的子类会默认实现(不用自己写),如果想要覆盖重写,也可以在实现类中覆盖重写
/** * 从java8开始,接口当中允许定义default默认方法 * 修饰符:public default(public可以省略,default不能省略) */ public interface MyInterface { void method1(); void method2(); default void methodNew() { System.out.println("接口默认方法执行"); } }
注意:接口中的default方法相当于是一个新的关键字,和四种修饰符的“default”并非一个概念。
活用default关键字,可以使程序达到“多继承”的效果。
static方法
从java8开始,接口当中允许定义静态方法,用法与一般类的静态方法相同。
public interface Animal { void eat(); static Animal getAnimal() { return new Cat(); } }
流式操作
流式处理给开发者的第一感觉就是让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现。
比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现:
对于一个nums的集合:
List<Integer> evens = new ArrayList<>(); for (final Integer num : nums) { if (num % 2 == 0) { evens.add(num); } }
通过java8的流式处理,我们可以将代码简化为:
List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
先简单解释一下上面这行语句的含义,stream()操作将集合转换成一个流,filter()执行我们自定义的筛选处理,这里是通过lambda表达式筛选出所有偶数,最后我们通过collect()对结果进行封装处理,并通过Collectors.toList()指定其封装成为一个List集合返回。
常用操作案例:
//初始化list集合 List<String> list = new ArrayList<String>(); list.add("测试数据1"); list.add("测试数据2"); list.add("测试数据3"); list.add("测试数据12"); //使用λ表达式遍历集合 list.forEach(s -> System.out.println(s)); //结合Predicate使用和过滤条件筛选元素 Predicate<String> contain1 = n -> n.contains("1"); Predicate<String> contain2 = n -> n.contains("2"); //根据条件遍历集合 list.stream().filter(contain1).forEach(n -> System.out.println(n)); list.stream().filter(s -> contain1.test(s)).forEach(s -> System.out.println(s)); list.stream().filter(contain1.and(contain2)).forEach(n -> System.out.println(n)); list.stream().filter(contain1.or(contain2)).forEach(n -> System.out.println(n)); //将过滤后的元素重新放到一个集合中 List<String> newList = list.stream().filter(contain1.and(contain2)).collect(Collectors.toList()); 集合中decimal求和 BigDecimal sum = list .stream() .map(Person::getAmount) .reduce(BigDecimal::add) .get(); //排序 , 也需要新的集合接收 List<Student> resultList = new ArrayList<Student>(); resultList = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList())
推荐java相关文章:java零基础入门
欢迎大家一起来学习!
Atas ialah kandungan terperinci JDK8新特性详细介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Versi Mac WebStorm
Alat pembangunan JavaScript yang berguna

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Dreamweaver Mac版
Alat pembangunan web visual

mPDF
mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular