Java8新特性:接口默认方法和静态方法
JDK1.8 打破了接口只提供了形式,而未提供任何具体实现这一限制,允许定义默认方法和静态方法。
定义一个接口:
package com.zgjt.design.defaults;
import java.util.function.Supplier;
public interface Animal {
//接口默认方法,不必重写
default void run(){
System.out.println("running");
}
void swim();
//接口静态方法
static Animal createAnimal(Supplier<Animal> supplier){
return supplier.get();
}
}
实现这个接口:
package com.zgjt.design.defaults;
public class Bird implements Animal{
@Override
public void swim() {
System.out.println("swimming");
}
}
测试:
package com.zgjt.design.defaults;
public class Test {
public static void main(String[] args){
Animal a = new Bird();
a.run();
a.swim();
Animal b = Animal.createAnimal(Bird::new);
b.run();
b.swim();
}
}
运行输出:
running
swimming
running
swimming
接口默认方法 '类优先' 原则:如果一个接口实现类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略
接口冲突:如果一个类实现了两个接口,两个接口中都有同样的默认方法,该类必须要覆写方法解决冲突,否则会报错。
Java8新特性:Lambda表达式
Lambda 是一个匿名函数,可以理解为是一段可以传递的代码,可以将代码像传递参数、传递数据一样进行传输。Lambda 并不是任何地方都可以使用,Lambda 表达式需要“函数式接口”的支持。
接口中只有一个抽象方法的接口,称为函数式接口,可以用 @FunctionalInterface 修饰一下。
lambda 示例:
public class LambdaTest {
public void print() {
Thread thread = new Thread(() -> System.out.println("Hello World"));
}
}
lambda 语法结构:
1,左边的参数列表,对应的是函数式接口中抽象方法的参数列表;
2,中间的符号:->,为固定写法;
3,右边大括号内对函数接口抽象方法的实现。
Java8新特性:Stream Api
Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作,在新版的JPA中,也已经加入了Stream。
@Query("select u from User u")
Stream<User> findAllByCustomQueryAndStream();
Stream<User> readAllByFirstnameNotNull();
@Query("select u from User u")
Stream<User> streamAllPaged(Pageable pageable);
Stream 简单操作:
从集合中获取 Stream
List<Person> list = new ArrayList<>();
list.add(new Person("张三",22,170,129,"中国"));
list.add(new Person("李四",23,172,111,"中国"));
list.add(new Person("王五",21,171,140,"中国"));
list.add(new Person("马六",25,180,122,"中国"));
list.add(new Person("宫本",24,187,150,"日本"));
list.add(new Person("宫本",24,187,150,"日本"));
list.Stream();
转换成 list 等
//list
List l = list.stream().collect(Collectors.toList())
//字符串
String s = list.stream().map(e ->
e.getCountry()
).collect( joining() );
//带分隔符
String s = list.stream().map(e ->
e.getCountry()
).collect( joining("|") );
//分隔符,前后缀
String s = list.stream().map(e ->
e.getCountry()
).collect( joining("|","{","}") );
过滤
//查找23岁一下的
list.stream().filter( e -> e.getAge() < 23 && e.getHeight() <= 170 );
去重
list.stream().distinct()
遍历
list.stream().forEach(System.out::println);
转换 Stream(列的增加减少)
List<String> strList = list.stream().map(e -> {
return e.getCountry();
} )
排序
list.stream().sorted((o1,o2)->{
if(o1.getCountry().equals(o2.getCountry())){
return o1.getAge() - o2.getAge();
}else{
return o1.getName().compareTo(o2.getName());
}
})
匹配
//是否都大于 22
list.stream().allMatch( e -> e.getAge() > 22)
最大值
Optional<Person> p = list.stream().max( (o1, o2)->
o2.getAge() - o1.getAge()
);
System.out.println( p.get());
统计
list.stream().count()
累加
list.stream().map(e -> e.getAge()).reduce(Integer::sum).get()
平均值
list.stream().collect(Collectors.averagingInt(e -> e.getAge()))
分类统计
list.stream().
collect(
Collectors.groupingBy( e -> e.getCountry())
);
list.stream().
collect(
Collectors.groupingBy( e -> e.getCountry(),counting())
);
标签:getAge,JAVA,Stream,stream,list,特性,jdk8,接口,new
From: https://www.cnblogs.com/cnff/p/14303135.html