JAVA基础-jdk8新特性
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()) );
本文作者:primaryC
本文链接:https://www.cnblogs.com/cnff/p/14303135.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步