java8 lambda map<list>排序_Java8中的Stream详解

70f895b7dbda57aaadf846ffa2dcf9c5.png

java8已经发布相当长一段时间了,我工作中一直维护的几个项目发布在很多环境中,我也不敢保证每个环境的JDK都是1.8版本以上的,也就一直没在工作中使用java8的一些新特性

java8刚发布时我学习了一下,写了一些demo,没有及时的进行归档,现在这些demo基本都已经找不到了。在工作中每每遇到对集合进行一些操作时都很头疼,只能不停的对集合进行for循环,有时还需要对同一个集合循环两次以上,不仅效率不高,还浪费服务器资源,数据量大时还可能内存溢出

痛定思痛,我还是决定把学而又忘的java8的新特性进行重新的梳理和学习,本文主要讲如何利用stream对集合进行一系列的操作,包括排序、取最大值、过滤等

没有过多的文字描述,直接上代码。以下代码中的每个方法都可以单独拿出来运行,方便在实际工作中的快速使用

package com.helianxiaowu.java8;


import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @title java8的集合stream操作详解
 * @desc
 * @author helianxiaowu
 * @date 2020/2/1 23:20
 */
public class StreamDemo {

    /**
     * 获取集合中的最大值或最小值
     */
    @Test
    public void testMaxAndMin(){
        List<Integer> list = Arrays.asList(1, -1, 2, -2);
        Integer max = list.stream().max((i, j) -> Integer.compare(i, j)).get();
        Integer min = list.stream().min((i, j) -> Integer.compare(i, j)).get();
        System.out.printf("max=%s, min=%s", max, min); // max=2, min=-2
    }

    /**
     * 排序
     */
    @Test
    public void testSorted() {
        List<Integer> list = Arrays.asList(1, 4, 3, 2);

        // 正序排序
        List<Integer> sortedList1 = list.stream().sorted().collect(Collectors.toList());
        System.out.printf("sortedList1=%s%n", sortedList1);// sortedList1=[1, 2, 3, 4]

        // 倒序排序
        List<Integer> sortedList2 = list.stream().sorted((i, j)-> Long.compare(j, i)).collect(Collectors.toList());
        System.out.printf("sortedList2=%s", sortedList2);// sortedList2=[4, 3, 2, 1]
    }

    /**
     * 使用map可以访问list中的元素的某些属性或方法
     */
    @Test
    public void testMap() {
        List<String> list = Arrays.asList("a", "java", "helianxiaowu");
        // 获取list中的字符串的长度
        List<Integer> mapList = list.stream().map(String::length).collect(Collectors.toList());
        System.out.printf("mapList=%s%n", mapList); // mapList=[1, 4, 12]
    }

    /**
     * 滤重
     */
    @Test
    public void testDistinct() {
        List<Integer> list = Arrays.asList(1, 2, 2, 3, 3, 3);
        List<Integer> distinctList = list.stream().distinct().collect(Collectors.toList());
        System.out.printf("distinctList=%s", distinctList); // distinctList=[1, 2, 3]
    }

    /**
     * limit可以取出集合中的前n个元素
     */
    @Test
    public void testLimit() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
        // 取出前3个元素
        List<Integer> limitList = list.stream().limit(3).collect(Collectors.toList());
        System.out.printf("limitList=%s", limitList); // limitList=[1, 2, 3]
    }

    /**
     * skip可以去除list中的前n个元素,与limit相反作用
     */
    @Test
    public void testSkip() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
        // 去除list中的前3个元素
        List<Integer> skipList = list.stream().skip(3).collect(Collectors.toList());
        System.out.printf("skipList=%s", skipList); // skipList=[4, 5, 6]
    }

    /**
     * 根据条件过滤集合中的元素
     */
    @Test
    public void testFilter() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
        // 过滤能被2整除的元素
        List<Integer> filterList = list.stream().filter(i -> i%2==0).collect(Collectors.toList());
        System.out.printf("filterList=%s", filterList); // filterList=[2, 4, 6]
    }

    /**
     * 聚合
     */
    @Test
    public void testReduce() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        // 计算list中所有元素的乘积
        Integer integer = list.stream().reduce((i, j) -> i * j).get();
        System.out.printf("integer=%s", integer); // integer=24
    }

    /**
     * 匹配
     *  anyMatch 集合中的元素有一个满足条件就返回true
     *  allMatch 集合中的元素全部满足条件返回true
     *  noneMatch 集合中的元素都不满足条件返回true
     */
    @Test
    public void testMatch() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        // list中有没有大于等于4的元素
        boolean b1 = list.stream().anyMatch(i -> i >= 4);
        System.out.printf("b1=%s%n", b1);// b1=true

        // list中的元素是否全部大于4
        boolean b2 = list.stream().allMatch(i -> i > 4);
        System.out.printf("b2=%s%n", b2); // b2=false

        // list中的元素是否没有大于4的
        boolean b3 = list.stream().noneMatch(i -> i > 4);
        System.out.printf("b3=%s", b3);// b3=true

    }
}

stream使用起来如此方便,或许你会关心它的性能到底如何。可以参考相关的性能测试数据,结论是stream的性能无需担心


微信搜索赫连小伍关注我的公众号,文章不定期推送

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值