十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇文章为大家展示了Java8中怎么利用Stream实现中间操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、雅安服务器托管、营销软件、网站建设、巴州网站维护、网站推广。介绍Stream
Stream 使用一种类似用于SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。
Stream两种操作
中间操作(Intermediate Operations):中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。
终端操作(Terminal Operations):是指返回最终的结果。一个流只能有一个terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。
中间操作方法分类:
filter()
map()
flatMap()
distinct()
sorted()
peek()
limit()
skip()
终端操作方法分类:
forEach()
forEachOrdered()
toArray()
reduce()
collect()
min()
max()
count()
anyMatch()
allMatch()
noneMatch()
findFirst()
findAny()
中间操作代码实例详解
1、filter(): 返回结果生成新的流中只包含满足筛选条件的数据。
// 1、filter,返回大于2的元素集合 Listnums = Arrays.asList(1, 2, 3, 4, 5); List result = nums.stream().filter(n -> n > 2).collect(Collectors.toList()); System.out.println(result);
运行结果:[3, 4, 5]
2、map():将流中的元素进行再次加工形成一个新流,流中的每一个元素映射为另外的元素。
// 2、map:返回元素的大写类型和哈希值 Listmzc = Arrays.asList("ma", "zhi", "chu"); List mzcUpperCase = mzc.stream(). map(n -> n.toUpperCase()). collect(Collectors.toList()); List mzcHashCode = mzc.stream().map(n -> n.hashCode()).collect(Collectors.toList()); System.out.println("mzcUpperCase:"+mzcUpperCase+" ----- mzcHashCode:"+mzcHashCode);
运行结果:
mzcUpperCase:[MA, ZHI, CHU] ----- mzcHashCode:[3476, 120571, 98480]
示例场景:取出商品的所有id,就可以这样写(伪代码):
List
List
这样就可以拿到所有商品id的集合。
3、flatMap():扁平化映射,它具体的操作是将多个stream连接成一个stream,这个操作是针对类似多维数组的,比如集合里面包含集合,相当于降维作用。
flatMap是将流中的每个元素都放到一个流中,最后将所有的流合并成一个新流,所有流对象中的元素都合并到这个新生成的流中返回。
// flatMap:将多层集合中的元素取出来,放到一个新的集合中去 Listnum1 = Arrays.asList(1, 2, 3); List num2 = Arrays.asList(4, 5, 6); List num3 = Arrays.asList(7, 8, 9); List > lists = Arrays.asList(num1, num2, num3); Stream
outputStream = lists.stream().flatMap(l -> l.stream()); List flatMapResult = outputStream.sorted().collect(Collectors.toList()); System.out.println(flatMapResult);
运行结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]
示例场景:取出所有部门人员的姓名,就可以这样写(伪代码):
// 1、取出所有部门
List
// 2、这个时候可以利用flatMap先将所有部门的所有人员汇聚起来
List
// 3、再利用map()方法取出
4、distinct():顾名思义,将流中的元素去重之后输出。
Listmzc = Stream.of("ma","zhi","chu","zhi","shuo","ma") .distinct() .collect(Collectors.toList()); System.out.println(mzc);
运行结果:[ma, zhi, chu, shuo]
5、sorted():这个很简单了,顾名思义,将流中的元素按照自然排序方式进行排序。
// sorted:自然顺序排序 Listnums = Arrays.asList(1, 3, 5, 6, 8, 2); List sortedNum = nums.stream().sorted().collect(Collectors.toList()); System.out.println(sortedNum); // sorted:降序排序 List sortedNum2 = nums.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()); System.out.println(sortedNum2); // sorted:使用Comparator List sortedNums3 = nums.stream().sorted(Comparator.comparing(n -> n)).collect(Collectors.toList()); System.out.println(sortedNums3); // 不用stream直接顺序排序 nums.sort(Comparator.comparing(Integer::intValue)); System.out.println(nums); //不用stream直接降序排序 nums.sort(Comparator.comparing(Integer::intValue).reversed()); System.out.println(nums);
运行结果:
[1, 2, 3, 5, 6, 8]
[8, 6, 5, 3, 2, 1]
[1, 2, 3, 5, 6, 8]
[1, 2, 3, 5, 6, 8]
[8, 6, 5, 3, 2, 1]
6、peek():对流中每个元素执行操作,并返回一个新的流,返回的流还是包含原来流中的元素。
// peek(): String[] arr = new String[]{"a","b","c","d"}; Arrays.stream(arr) .peek(System.out::println) //a,b,c,d .count(); // peek()+filter() Stream.of("ma", "zhi", "chu") .filter(e -> e.length() > 2) .peek(e -> System.out.println(e)) .collect(Collectors.toList());
运行结果:
a
b
c
d
zhi
chu
7、limit():顾名思义,返回指定数量的元素的流。返回的是Stream里前面的n个元素。
// limit():取出100中的前十个 ListlimitNum = IntStream.range(1,100).limit(10) .boxed() .collect(Collectors.toList()); System.out.println(limitNum); // limit():取出前4个单词 List words = Arrays.asList("ma", "zhi", "chu", "wait", "you", "follow"); List limitWord = words.stream().limit(4).collect(Collectors.toList()); System.out.println(limitWord);
运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[ma, zhi, chu, wait]
8、skip():和limit()相反,将前几个元素跳过(取出)再返回一个流,如果流中的元素小于或者等于n,就会返回一个空的流。
// skip():跳过前面三个单词再返回 Listwords = Arrays.asList("ma", "zhi", "chu", "wait", "you", "follow"); List skipWord = words.stream().limit(4).collect(Collectors.toList()); System.out.println(skipWord); // skip():跳过全部单词再返回 List emptyWord = words.stream().skip(6).collect(Collectors.toList()); System.out.println(emptyWord); // skip():跳过超过单词长度的数目再返回 List emptyWord2 = words.stream().skip(10).collect(Collectors.toList()); System.out.println(emptyWord);
运行结果:
[91, 92, 93, 94, 95, 96, 97, 98, 99]
[ma, zhi, chu, wait]
[]
[]
上述内容就是Java8中怎么利用Stream实现中间操作,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联网站建设公司行业资讯频道。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。