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 中国大陆许可协议进行许可。

posted @   primaryC  阅读(28)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.