上一篇:https://blog.csdn.net/qq_42068838/article/details/118305255
1、函数式接口
①、概念:函数式接口主要指只包含一个抽象方法的接口,如:java.lang.Runnable、java.util.Comparator接口等。Java8提供@FunctionalInterface注解来定义函数式接口,若定义的接口不符合函数式的规范便会报错。
②、Java8中增加了java.util.function包,该包包含了常用的函数式接口,常用的有:
2、 Lambda表达式
①、概念:Lambda 表达式是实例化函数式接口的重要方式,使用 Lambda 表达式可以使代码变的更加简洁紧凑。
②、语法格式:(参数列表) -> { 方法体; } 。 其中()、参数类型、{} 以及return关键字 可以省略。
3、方法引用
①、概念:方法引用主要指通过方法的名字来指向一个方法而不需要为方法引用提供方法体,该方法的调用交给函数式接口执行。
②、语法格式:对象的非静态方法引用 ObjectName :: MethodName
类的静态方法引用 ClassName :: StaticMethodName
类的非静态方法引用 ClassName :: MethodName
构造器的引用 ClassName :: new
数组的引用 TypeName[] :: new
4、代码演示
①、使用匿名内部类实现函数式接口对象的创建
package com.newfeatures;
public class FunctionalInterfaceTest {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("我是既没有参数又没有返回值的方法!");
}
};
runnable.run();
}
}
②、使用Lambda表达式实现函数式接口对象的创建
package com.newfeatures;
public class FunctionalInterfaceTest {
public static void main(String[] args) {
//其中()、参数类型、{} 以及return关键字 可以省略。
Runnable runnable1 = () -> {
System.out.println("我是既没有参数又没有返回值的方法!");
};
Runnable runnable2 = () -> System.out.println("我是既没有参数又没有返回值的方法!");
}
}
③、使用方法引用实现person类中show方法的调用
person类
package com.newfeatures;
public class Person {
void show(){
System.out.println("吃了吗?");
}
}
测试类
package com.newfeatures;
import com.designpattern.decorator.Source;
public class FunctionalInterfaceTest {
public static void main(String[] args) {
Person person=new Person();
Runnable runnable=person::show;
runnable.run();
}
}
5、Stream接口
①、概念:java.util.stream.Stream接口是对集合功能的增强,可以对集合元素进行复杂的查找、过滤、筛选等操作。
②、创建方式:
方式一:通过调用集合的默认方法来获取流,如:default Stream stream()
方式二:通过数组工具类中的静态方法来获取流,如:static IntStream stream(int[] array)
方式三:通过Stream接口的静态方法来获取流,如:static Stream of(T... values)
方式四:通过Stream接口的静态方法来获取流,static Stream generate(Supplier<? extends T>
④、筛选与切片的常用方法
⑤、映射的常用方法
⑥、排序的常用方法
⑦、匹配与查找的常用方法
⑧、代码演示
Person类
package com.newfeatures;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
void show(){
System.out.println("吃了吗?");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试类
package com.newfeatures;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
public class ListPersonTest {
public static void main(String[] args) {
// 1.准备一个List集合并放入Person类型的对象后打印
Person person=new Person("zhangfei", 30);
List<Person> list=new LinkedList<>();
list.add(new Person("zhangfei", 30));
list.add(new Person("xiaoqiao", 17));
list.add(new Person("zhouyu", 20));
list.add(new Person("zhangfei", 30));
list.add(new Person("guanyu", 35));
list.add(new Person("liubei", 40));
/**
* 匿名内部类方式
* 是要stream流将List集合中所有成年人过滤出来并放入另外一个集合中打印
*/
list.stream().filter(new Predicate<Person>() {
@Override
public boolean test(Person person) {
return person.getAge() >= 18;
}
}).forEach(new Consumer<Person>() {
@Override
public void accept(Person person) {
System.out.println(person);
}
});
/**
* 使用lambda表达式对上述代码进行优化
*/
list.stream().filter(person1 -> person1.getAge()>18).forEach(person1 -> System.out.println(person1));
/**
* 使用方法引用对上述代码进行优化
*/
list.stream().filter(person1 -> person1.getAge()>18).forEach(System.out::println);
}
}
6、Optional类
①、概念:Optional类可以理解为一个简单的容器,其值可能是null或者不是null,代表一个值存在 或不存在。
②、常用的方法:
③、代码演示
package com.newfeatures;
import java.util.Optional;
public class OptionalTest {
public static void main(String[] args) {
String str=null;
String str1="8888";
/**
* 使用Optional类实现空值的处理
*/
// 1.将数据str1装到Optional对象代表的容器中
Optional<String> optional = Optional.ofNullable(str);
// 2.建立映射关系 使用字符串的长度与字符串建立映射关系
Optional<Integer> integer=optional.map(s -> s.length());
System.out.println("integer = " + integer); // Optional.empty
System.out.println(integer.orElse(0)); // 0
}
}
7、集合工厂方法
①、概念:List、Set和Map集合中增加了静态工厂方法of实现不可变实例的创建。不可变体现在无法添加、修改和删除它们的元素。不允许添加null元素对象。
②、实际意义:保证线程安全:在并发程序中既保证线程安全性,也大大增强了并发时的效率。被不可信的类库使用时会很安全。如果一个对象不需要支持修改操作,将会节省空间和时间的开销。可以当作一个常量来对待,并且这个对象在以后也不会被改变。