首页 > 编程语言 >JAVA基础-jdk8新特性

JAVA基础-jdk8新特性

时间:2024-02-19 10:45:10浏览次数:33  
标签:getAge JAVA Stream stream list 特性 jdk8 接口 new

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

相关文章

  • Java开发的SRM供应商、在线询价、招投标采购一体化系统源码功能解析
    前言:随着全球化和信息化的发展,企业采购管理面临越来越多的挑战。传统的采购方式往往涉及到多个繁琐的步骤,包括供应商筛选、询价、招投标等,这些过程不仅耗时,而且容易出错。为了解决这些问题,供应商、询价、招投标一体化系统应运而生。该系统通过集成供应商管理、询价管理、招投标......
  • Java对象引用和内存管理的细节
    在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁。对象的销毁是由Java的垃圾回收器(GarbageCollector,GC)来管理的。在Java中,局部变量(如方法参数)通常存储在栈内存(StackMemory)中,而对象实例(如ServletConfig对象)则......
  • 关于java代码Runtime.getRuntime().exec()执行shell脚本中的坑
    java操作shell脚本执行docker命令  Runtime.getRuntime().exec()是不能执行特殊符号如">"、"|"等必须通过"/bin/sh""-c"处理。另外java操作docker 不能分配  dockerexec-i(不要t).另外如果不确定脚本是否执行成功,可以通过waitFor返回的int结果,如果为0脚本执行......
  • 提高Java开发生产力,我选Stream API,真香啊
    Java8引入的StreamAPI提供了一种新的数据处理方式,它以声明式、函数式的编程模型,极大地简化了对集合、数组或其他支持数据源的操作。Stream可以被看作是一系列元素的流水线。允许你高效地对大量数据执行复杂的过滤、映射、排序、聚合等操作,而无需显式地使用循环或者临时变量。St......
  • Java注解篇之@SuppressWarnings注解详解 代码编译通过且可以运行,但每行前面的“感叹号
    Java注解篇之@SuppressWarnings注解详解@SuppressWarnings作用:用于抑制编译器产生警告信息。它的注解目标为类、字段、函数、函数入参、构造函数和函数的局部变量,但是建议注解声明在最接近警告发生的位置。去感叹号?我们经常遇到代码编译通过且可以运行,但每行前面的“感叹号”就......
  • Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
    正月初九,开工大吉!2024年,更上一层楼!写在开头其实在List的继承关系中,除了ArrayList和LinkedList之外,还有另外一个集合类stack(栈),它继承自vector,线程安全,先进后出,随着Java并发编程的发展,它在很多应用场景下被逐渐替代,成为了Java的遗落之类。不过,stack在数据结构中仍有一席之地,因此,......
  • 深入了解 Java 方法和参数的使用方法
    Java方法简介方法是一块仅在调用时运行的代码。您可以将数据(称为参数)传递到方法中。方法用于执行特定的操作,它们也被称为函数。使用方法的原因重用代码:定义一次代码,多次使用。提高代码的结构化和可读性。将代码分解成更小的模块,易于维护和理解。创建方法方法必须在类内......
  • 监控Java虚拟线程
    目录监控Java虚拟线程简介虚拟线程监控的具体细节跟踪牵制线程(pinnedthreads)我的框架如何使用虚拟线程?监控ForkJoinPool结论参考监控Java虚拟线程开发便利性与运行高效性简介在我之前的文章中,我们已经讨论了什么是虚拟线程(VTs),他们与物理线程(PTs)之间的区别,以及如......
  • java 获取请求request,并返回请求的url
    StringwebStr=getRequest().getScheme()+"......
  • 运行 Java 文件
    编译javacHelloWorld.java#获得Java字节码文件HelloWorld.class运行javaHelloWorld#运行当前目录下的HelloWorld.class文件附加说明如果你的Java类在包内,你需要将package声明添加到你的Java文件顶部,并且在编译和运行时,你需要指定完整的类路径。假设你的......