stream()流操作

map 遍历&统计
public class Test {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Bob", "Alice", "Tim");
        List<Person> persons = names.stream().map(Person::new).collect(Collectors.toList());

        System.out.println(persons.get(1));
    }
}

class Person {
    String name;
    public Person(String name) {
        this.name = name;
    }
    public String toString() {
        return "Person:" + this.name;
    }
}
函数式编程-方法引用
interface Say{
    void say();
}

class Speaker{
    public static void speak(){
        System.out.println("Hello, my friend!");
    }
    
    public static void main(String[] args){
        Say say = Speaker::speak; // 这里的::表示我们引用了Speaker类的speak方法
        say.say();
        // 输出Hello, my friend!
    }
}

很神奇是不是?我们直接将一个方法引用赋给了一个接口的对象。这里初看的话显然问题一堆,首先方法怎么能作为对象赋值,其次该类也没有实现该接口,最后,就算能说通,我们的接口和Speaker类根本没有相同的方法啊!怎么就调用say.say()效果等同于Speaker.speak()呢?

重要:这是Java 8增加的一个小魔法:如果我们将一个方法引用或一个lambda表达式赋给一个函数式接口(且两个方法的返回值类型和参数类型可以匹配上,方法名并不重要),那么Java会自动调整这个赋值操作,使其能够匹配目标接口。

对于底层来说,这里是Java编译器创建一个实现了目标接口的类的实例,并将我们的方法引用或lambda表达式包裹在其中。

事实上,很容易预见,在这里如果我们直接将一个Speaker对象赋给一个Say接口,那么是无法做到的,因为Speaker虽然符合Say的模式,但却没有显式的实现Say接口。幸运的是,Java 8的函数式接口允许我们直接把一个实例方法赋给这样的一个接口,这样语法更好,更简单。

Java为我们准备了大量的函数式接口,这样我们就可以尽量避免自己创建大量的接口,这些接口都可以在Java.util.function包中轻松找到。

不过Java最多只准备了具有两个参数的函数式接口,但是接口又不难写,只要我们理解了函数式接口的意义和用法,自己写一个能容纳更多参数的函数式接口不过是信手拈来罢了。

参考文章
https://www.cnblogs.com/hgly1999/p/16814943.html

filter 过滤
List<String> list = Arrays.asList("1","2","3");
List<String> collect = list.stream.filter(item -> !item.equals("1")).collect(Collectors.toList());

filter 会把结果为 ture 的元素留下,collect = [2,3]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值