爱上Stream
流式编程,一般是对集合的一些操作,我只能说,用过就爱上了,特别的方便,写出来的代码也很简洁。
+--------------------+ +------+ +------+ +---+ +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+ +------+ +------+ +---+ +-------+
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
这里我们举例来自集合的情况
我们先生成一个list,后面我们就用这个集合做操作
List<String> list = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
一、过滤filter
这个方法很容易理解,就是过滤的意思,你可以用条件判断去过滤,也可以用正则表达式来过滤
1.正则 asPredicate()
将集合里的所有元素都去匹配这个pattern,匹配上了才会进入续的操作里。
Pattern pattern = Pattern.compile("\\$\\$\\((.*)\\)");
list.stream().filter(pattern.asPredicate()).collect(Collectors.toList());
2.条件过滤
这个就很简单了,以下的代码就是过滤出元素为"abc"的
list.stream().filter(i -> i == "abc").collect(Collectors.toList());
二、元素映射map
这个可以当做是,我们可以通过map将集合的所有元素进行任何操作,比如我将集合里的所有元素后面都加上后缀字符"suffix"
list.stream().map(i -> i + "suffix").collect(Collectors.toList());
当然,我们这里可以做任何操作,那么我写一个方法,比如叫做plusOne(),然后把每个元素都丢进去这个方法,得到一个结果
list.stream().map(TestAction::plusOne).collect(Collectors.toList()); private String plusOne(String s) { return s + "1"; }
这个是拓展性很高的方法,你可以做你任何想对这个元素做的事情
三、排序Sort
这个顾名思义就是排序,很简单,不需要说写什么。查了一下不知道能不能用自己写的比较器来使用。
list.stream().map(TestAction::plusOne).sorted().collect(Collectors.toList());
四、结果Collectors
Collectors可以把前面操作的结果生成你想要的集合
根据某个元素分组,如果这里的元素是水果的话,你可以根据它的“种类”分组
list.stream().map(TestAction::plusOne).sorted().collect(Collectors.groupingBy());
拼接,注意,这里返回的是String类型
list.stream().map(TestAction::plusOne).sorted().collect(Collectors.joining(","));
五、去重
list.stream().distinct();
六、并行