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())
        );
posted @ 2024-02-19 10:37  primaryC  阅读(20)  评论(0编辑  收藏  举报