java8新特性之stream详解

一. 基本概念
1.1 为什么加入 集合的流式操作
JDK8 的Stream 是一个受到 函数式编程 和 多核时代影响而产生的东西。很多时候我们需要到底层返回数据,上层再对数据进行遍历,进行一些数据统计,但是之前的Java API 中很少有这种方法,这就需要我们自己来 Iterator 来遍历,如果JDK 能够为我们提供一些这种方法,并且能够为我们优化就好了。
所以JDK8加入 了 java.util.stream包,实现了集合的流式操作,流式操作包括集合的过滤,排序,映射等功能。根据流的操作性,又可以分为 串行流 和 并行流。根据操作返回的结果不同,流式操作又分为中间操作和最终操作。大大方便了我们对于集合的操作。
● 最终操作:返回一特定类型的结果。
● 中间操作:返回流本身。

1.2 什么是 流
Stream 不是 集合元素,也不是数据结构,它相当于一个 高级版本的 Iterator,不可以重复遍历里面的数据,像水一样,流过了就一去不复返。它和普通的 Iterator 不同的是,它可以并行遍历,普通的 Iterator 只能是串行,在一个线程中执行。

二. 串行流和并行流:
串行流操作在一个线程中依次完成。并行流在多个线程中完成,主要利用了 JDK7 的 Fork/Join 框架来拆分任务和加速处理。相比串行流,并行流可以很大程度提高程序的效率。

三. 中间操作 和 最终操作
中间操作:
● filter(): 对元素进行过滤
● sorted():对元素排序
● map():元素映射
● distinct():去除重复的元素
最终操作:
● forEach():遍历每个元素。
● reduce():把Stream 元素组合起来。例如,字符串拼接,数值的 sum,min,max ,average 都是特殊的 reduce。
● collect():返回一个新的集合。
● min():找到最小值。
● max():找到最大值。

下面通过代码的方式详细讲解:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Created by zjx on 2017/7/12.
 */
public class Stream {

    public static void main(String[] args) {
    //初始化List集合
        User user = new User("张三",12,new ArrayList<String>(){{add("中国银行");add("纽约银行");add("商业银行");}},"成都");
        User user1 = new User("李四",23,new ArrayList<String>(){{add("建设银行");add("工业银行");add("商业银行");}},"北京");
        User user2 = new User("王五",43,new ArrayList<String>(){{add("成都银行");add("达州银行");add("乐山银行");}},"成都");
        User user3 = new User("曹操",15,new ArrayList<String>(){{add("中国银行");add("招商银行");add("浦东银行");}},"北京");
        User user4 = new User("孙权",24,new ArrayList<String>(){{add("广发银行");add("民生银行");add("商业银行");}},"成都");
        User user5 = new User("刘备",36,new ArrayList<String>(){{add("牡丹银行");add("工商银行");add("商业银行");}},"北京");
        List<User> users = new ArrayList<>();
        users.add(user);
        users.add(user1);
        users.add(user2);
        users.add(user3);
        users.add(user4);
        users.add(user5);

//        getUser(users);
//        System.out.println(getUserByStream(users));
//        System.out.println(getUsersByStream(users));
//        System.out.println(getUsersSortByStream(users));
//        traverse(users);
        System.out.println(getUsersOfAddressByStream(users));
}


    //获取符合条件的第一条数据
    public static User getUserByStream(List<User> users){

        return users.stream().filter(user -> user.getCards().contains("中国银行")).findFirst().get();
    }

    //获取符合条件的所以数据
    public static List<User> getUsersByStream(List<User> users){
        return users.stream().filter(user -> user.getCards().contains("中国银行")).collect(Collectors.toList());
    }

    //对集合根据某个字段进行分类
    public static Map<String,List<User>> getUsersSortByStream(List<User> users){
        return users.stream().collect(Collectors.groupingBy(User::getAddress));
    }

    //获取所有地址在成都的用户Id集合,通过map进行映射
    public static List<Integer> getUsersOfAddressByStream(List<User> users){
        return users.stream().filter(user -> user.getAddress() == "成都").map(User::getUserId).collect(Collectors.toList());
    }

    //获取所有地址在成都的用户的ID的集合
    public static List<Integer> getIdOfAddressByStream(List<User> users){
        return users.stream().filter(user -> user.getAddress() == "成都").map(User::getUserId).collect(Collectors.toList());
    }

    //遍历集合
    public static void traverse(List<User> users){
        users.stream().forEach(System.out::println);
    }
}

实体类

import java.util.List;

/**
 * Created by zjx on 2017/7/12.
 */
public class User {

    /**
     * 用户名
     */
    private String userName;

    /**
     * 用户ID
     */
    private int userId;

    /**
     * 银行卡集合
     */
    private List<String> cards;

    /**
     * 地址
     */
    private String address;

    public User(String userName, int userId, List<String> cards, String address) {
        this.userName = userName;
        this.userId = userId;
        this.cards = cards;
        this.address = address;
    }

    public User() {
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public List<String> getCards() {
        return cards;
    }

    public void setCards(List<String> cards) {
        this.cards = cards;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", userId=" + userId +
                ", cards=" + cards +
                ", address='" + address + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值