lambda-stream流-泛型-字符串

函数式编程

idea功能,跟踪当前流链

lambda

JDK8中的一个语法糖,对某些匿名内部类写法进行简化
匿名内部类 https://blog.csdn.net/cao124383050/article/details/102862120

    public static <R> R typeConver(Function<String,R> function){
        String str = "12345";
        R result = function.apply(str);
        return result;
    }
    public static void main(String[] args) {
        //其实相当于省略了一句
        //Function<String,Integer> function = new Functionimpl<String, Integer>();
        //匿名内部类等于快速给这个接口创建一个实现类,重写接口中的方法
        /*Integer result = typeConver(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return Integer.valueOf(s);
            }
        });*/
        Integer result = typeConver((String s) -> {
                return Integer.valueOf(s);

        });
        System.out.println(result);

        String result1 = typeConver(s -> s + "dudu");
        //看着懵懵的,怎样快速看懂
        //找typeConver,参数有个接口,typeConver方法体里有调用这个接口的方法
        //括号里就是这个接口这个方法的重写实现
        System.out.println(result1);
    }

接口且只有一个方法需要重写可以改写成lambda表达式

参数类型,小括号大括号在一些情况下可以省略

  • 参数类型可以省略
  • 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
  • 方法只有一个参数时小括号可以省略

stream流

对集合或者数组进行操作

第一步创建流

回忆了一下map

Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。

Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。

单列集合,数组,双列集合(先转换成单列集合再创建)

中间操作

distinct方法是依赖Object的equals方法(地址值相同)来判断是否是相同对象的。所以需要注意重写equals方法

如果调用空参的sorted()方法,需要流中的元素是实现了Comparable接口

function:两个参数,前面的变成后面的;
Predicate:返回true的留在流中

map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素。

//        打印所有书籍的名字。要求对重复的元素进行去重。
        List<Author> authors = getAuthors();

        authors.stream()
                .flatMap(author -> author.getBooks().stream())
                .distinct()
                .forEach(book -> System.out.println(book.getName()));

flatmap要注意,每个元素author转换book的list,还需要转换成流返回

终结操作

forEach,min,max,count,collect
anyMatch,allMatch
reduce缩减操作(对流中的数据按照你指定的计算方式计算出一个结果)
两个参数的需要赋初始值,一个参数的默认选流中的第一个值当作初始值(看源码)

stream注意事项:惰性求值;流仅能用一次;对原数据没影响

optional

更优雅地避免空指针异常
ofNullable 把数据封装成一个Optional对象。无论传入的参数是否为null都不会出现问题。
创建对象,
安全地消费值ifPresent
安全获取值orELseGet,orElseThrow

函数式接口

只有一个抽象方法的接口我们称之为函数接口。
@FunctionalInterface注解进行标识

Consumer消费接口:对传入的参数进行操作
Function转换接口:对传入的参数进行转换
supplier生成接口:无参数,只有返回值
predicate判断接口

常用的默认方法

方法引用

简化lambda表达式的语法糖
在使用lambda时,如果方法体中只有一个方法的调用的话(包括构造方法),我们可以用方法引用进一步简化代码

类名或者对象类::方法名

引用类的静态方法
引用对象的实例方法
引用类的实例方法
构造器引用

泛型

可以接收不同类型的参数,进行相同的一组处理,不能使用基本数据类型

Java泛型是一个伪泛型,这是因为Java在编译期间所有泛型信息都会被擦除掉。Java泛型基本上都是在编译器这个层次上实现的,在生成字节码中是不包括泛型中的类型信息

https://blog.csdn.net/Sunshineoe/article/details/110162807
这个学完,把mp的代码简单看一遍,相关不清楚的操作现在一定有新的理解

posted @ 2025-05-08 18:58  huhulahu  阅读(22)  评论(0)    收藏  举报