Lambda表达式和SteamAPI

Lambda表达式和SteamAPI是JDK8的新特性,所有在实验下面代码时候,请升级JDK到8版本,否则会编译 报错。

首先看Lambda表达式,同正则表达式类似,Lambda表达式不能在JAVA代码中直接使用,先得做一下封装。


import java.util.ArrayList;

public class LabExamp {
    /**
     *  Lambda表达式(λ表达式)可见有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //Runnable r1=(x,y)->{return x+y;};
        ArrayList<Student> list=new ArrayList<Student>();
        Student std1=new Student();
        std1.setId(1);
        std1.setName("小王");
        list.add(std1);
        Student std2=new Student();
        std2.setId(2);
        std2.setName("小张");
        list.add(std2);
        
    //    list.forEach(o -> {System.out.println(o);});
    //    list.forEach(o -> ((Student) o).getName()); //如果省略ArrayList的类型声明,则必须这么写强制转型
        list.forEach(stu -> {System.out.println( stu.getName());});
        
        
        for(Student o: list) { // 外部迭代
                System.out.println(o.getName());
        }
        
        
    }
    
}

---------------------------------------------------------------------------


public class Student {
    private  Integer id;
    private  String name;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}


上面例子中可以看出,Lambda表达式跟for循环的代码效果是一样的,但是用Lambda表达式更加简洁。



接着是SteamAPI,

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。


import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class SteamExamp {
/*
 *
 * Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。
 * 同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,
 * 使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错,
 * 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。
 */
    public static void main(String[] args) {
        ArrayList<Student> list=new ArrayList<Student>();
        Student std1=new Student();
        std1.setId(1);
        std1.setName("小王");
        list.add(std1);
        Student std2=new Student();
        std2.setId(2);
        std2.setName("小张");
        list.add(std2);
        Student std6=new Student();
        std6.setId(6);
        std6.setName("小刘");
        list.add(std6);    
        Student std3=new Student();
        std3.setId(3);
        std3.setName("小李子");
        list.add(std3);    

//        ArrayList<Student> transactionsIds = list.parallelStream().
//                 filter(t -> t.getType() == Transaction.GROCERY).
//                 sorted(comparing(Transaction::getValue).reversed()).
//                 map(Transaction::getId).
//                 collect(toList());
        ArrayList<Integer> transactionsIds = (ArrayList<Integer>) list.parallelStream().
                 sorted((p1, p2) ->  p1.getId().compareTo(p2.getId())).
                 map(Student::getId).
                 collect(Collectors.toList());    
        ArrayList<Integer> transactionsIds2 = (ArrayList<Integer>) list.parallelStream().
                 sorted((p1, p2) ->  p2.getId().compareTo(p1.getId())).
                 map(Student::getId).
                 collect(Collectors.toList());
        System.out.println(transactionsIds);
        System.out.println(transactionsIds2);
        
        //流的数据源不一定是一个已存在的集合对象,也可能是个“生成器函数”。一个生成器函数会产生一系列元素,供给一个流。
        //Stream.generate(Supplier<T> s)就是一个生成器函数。其中参数Supplier是一个函数接口,里面有唯一的抽象方法 <T> get()。
        Stream.generate(Math::random).limit(5).forEach(System.out::println);
    }



}

----------------------------------------------------

上例输出结果可能是:

[1, 2, 3, 6]
[6, 3, 2, 1]
0.10556146349285433
0.08263394346689457
0.13330880751987728
0.05459269439895098
0.055821882208000884


=======================================================

上面程序的例子就是使用了SteamAPI实现了ArrayList正序和逆序的排列。最后一段是如何产生应该5个元素的随机数列。简单说,对 Stream 的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect)。Java8引入Steam概念的目标是配合“集合类批处理操作”的内部迭代和并行处理。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值