咱们日常工作中,Lambda 应用比拟多的场景,就是汇合类下的 Lambda 流操作,往往几行代码能够帮忙咱们实现简单代码

接下来咱们把 Lambda 流的罕用办法用案列解说一下。

ForEach

汇合的遍历forEach办法

public void testForEach(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("3");        }};        list.forEach(s-> System.out.println(s));    }

Collect

将操作后的对象转化为新的对象

public void testCollect(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("2");        }};        //转换为新的list        List newList = list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());    }

Filter

Filter 为过滤的意思,只有满足 Filter 表达式的数据就能够留下来,不满足的数据被过滤掉

public void testFilter() {        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("3");        }};                        list.stream()                // 过滤掉咱们心愿留下来的值                // 示意咱们心愿字符串是 1 能留下来                // 其余的过滤掉                .filter(str -> "1".equals(str))                .collect(Collectors.toList());    }

Map

map 办法能够让咱们进行一些流的转化,比方原来流中的元素是 A,通过 map 操作,能够使返回的流中的元素是 B

public void testMap() {        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("3");        }};        //通过 map 办法list中元素转化成 小写        List<String> strLowerList = list.stream()                .map(str -> str.toLowerCase())                .collect(Collectors.toList());    }

MapToInt

mapToInt 办法的性能和 map 办法一样,只不过 mapToInt 返回的后果曾经没有泛型,曾经明确是 int 类型的流了,源码如下:

public void testMapToInt() {        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("3");        }};        list.stream()                .mapToInt(s->Integer.valueOf(s))                // 肯定要有 mapToObj,因为 mapToInt 返回的是 IntStream,因为曾经确定是 int 类型了                // 所有没有泛型的,而 Collectors.toList() 强制要求有泛型的流,所以须要应用 mapToObj                // 办法返回有泛型的流                .mapToObj(s->s)                .collect(Collectors.toList());        list.stream()                .mapToDouble(s->Double.valueOf(s))                // DoubleStream/IntStream 有许多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等办法                .sum();    }

Distinct

distinct 办法有去重的性能

public void testDistinct(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("2");        }};        list.stream()                .map(s -> Integer.valueOf(s))                .distinct()                .collect(Collectors.toList());    }

Sorted

Sorted 办法提供了排序的性能,并且容许咱们自定义排序

public void testSorted(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("3");        }};        list.stream()                .map(s -> Integer.valueOf(s))                // 等同于 .sorted(Comparator.naturalOrder()) 天然排序                .sorted()                .collect(Collectors.toList());        // 自定义排序器        list.stream()                .map(s -> Integer.valueOf(s))                // 反天然排序                .sorted(Comparator.reverseOrder())                .collect(Collectors.toList());    }

groupingBy

groupingBy 是可能依据字段进行分组,toMap 是把 List 的数据格式转化成 Map 的格局

public void testGroupBy(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("2");        }};        Map<String, List<String>> strList = list.stream().collect(Collectors.groupingBy(s -> {            if("2".equals(s)) {                return "2";            }else {                return "1";            }        }));    }

FindFirst

findFirst 示意匹配到第一个满足条件的值就返回

public void testFindFirst(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("2");        }};                list.stream()                .filter(s->"2".equals(s))                .findFirst()                .get();                // 避免空指针        list.stream()                .filter(s->"2".equals(s))                .findFirst()                // orElse 示意如果 findFirst 返回 null 的话,就返回 orElse 里的内容                .orElse("3");        Optional<String> str= list.stream()                .filter(s->"2".equals(s))                .findFirst();        // isPresent 为 true 的话,示意 value != null        if(str.isPresent()){            return;        }    }

Reduce

reduce 办法容许咱们在循环外面叠加计算值

public void testReduce(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("3");        }};                list.stream()                .map(s -> Integer.valueOf(s))                // s1 和 s2 示意循环中的前后两个数                .reduce((s1,s2) -> s1+s2)                .orElse(0);        list.stream()                .map(s -> Integer.valueOf(s))                // 第一个参数示意基数,会从 100 开始加                .reduce(100,(s1,s2) -> s1+s2);    }

Peek

peek 办法很简略,咱们在 peek 办法外面做任意没有返回值的事件,比方打印日志

public void testPeek(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("3");        }};        list.stream().map(s -> Integer.valueOf(s))                .peek(s -> System.out.println(s))                .collect(Collectors.toList());    }

Limit

limit 办法会限度输入值个数,入参是限度的个数大小

public void testLimit(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("3");        }};        list.stream()                .map(s -> Integer.valueOf(s))                .limit(2L)                .collect(Collectors.toList());    }

Max,Min

通过max、min办法,能够获取汇合中最大、最小的对象

public void testMaxMin(){        List<String> list = new ArrayList<String>() {{            add("1");            add("2");            add("2");        }};        list.stream().max(Comparator.comparing(s -> Integer.valueOf(s))).get();        list.stream().min(Comparator.comparing(s -> Integer.valueOf(s))).get();    }

总结

本文咱们介绍十几种 Lambda 表达式罕用的办法

懂这些,这样你在工作中遇到简单数据结构转化时,必定会得心应手了。

最初

欢送关注公众号:月伴飞鱼

1.每天分享一篇实用的技术文章,对面试,工作都有帮忙

2.后盾回复666,取得海量收费电子书籍,会继续更新,分享

感觉有播种,记得点赞,转发,分享,谢谢