java中的stream的泛型方法的使用示例
本文章使用jdk8测试 ,并结合使用lambda测试
测试前准备一些测试数据:
class ObjectDemo {
private Integer id;
private String name;
private Integer classNo;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getClassNo() {
return classNo;
}
public void setClassNo(Integer classNo) {
this.classNo = classNo;
}
@Override
public String toString() {
return "ObjectDemo{" +
"id=" + id +
", name='" + name + '\'' +
", classNo=" + classNo +
'}';
}
}
class ObjectDemoList {
List<ObjectDemo> getSomeDemo() {
//手动简历一些测试对象,加入到list中,模拟为从数据库取出来的数据
List<ObjectDemo> objectDemoList = new ArrayList<ObjectDemo>();
ObjectDemo objectDemo1 = new ObjectDemo();
ObjectDemo objectDemo2 = new ObjectDemo();
ObjectDemo objectDemo3 = new ObjectDemo();
ObjectDemo objectDemo4 = new ObjectDemo();
ObjectDemo objectDemo5 = new ObjectDemo();
ObjectDemo objectDemo6 = new ObjectDemo();
ObjectDemo objectDemo7 = new ObjectDemo();
ObjectDemo objectDemo8 = new ObjectDemo();
ObjectDemo objectDemo9 = new ObjectDemo();
ObjectDemo objectDemo10 = new ObjectDemo();
//手动赋值
objectDemo1.setId(1);
objectDemo1.setClassNo(1);
objectDemo1.setName("object01");
objectDemo2.setId(2);
objectDemo2.setClassNo(1);
objectDemo2.setName("object02");
objectDemo3.setId(3);
objectDemo3.setClassNo(1);
objectDemo3.setName("object03");
objectDemo4.setId(5);
objectDemo4.setClassNo(2);
objectDemo4.setName("object05");
objectDemo5.setId(6);
objectDemo5.setClassNo(3);
objectDemo5.setName("object06");
objectDemo6.setId(7);
objectDemo6.setClassNo(3);
objectDemo6.setName("object07");
objectDemo7.setId(8);
objectDemo7.setClassNo(3);
objectDemo7.setName("object08");
objectDemo8.setId(9);
objectDemo8.setClassNo(3);
objectDemo8.setName("object09");
objectDemo9.setId(10);
objectDemo9.setClassNo(4);
objectDemo9.setName("object10");
objectDemo10.setId(4);
objectDemo10.setClassNo(4);
objectDemo10.setName("object04");
objectDemoList.add(objectDemo1);
objectDemoList.add(objectDemo2);
objectDemoList.add(objectDemo3);
objectDemoList.add(objectDemo4);
objectDemoList.add(objectDemo5);
objectDemoList.add(objectDemo6);
objectDemoList.add(objectDemo7);
objectDemoList.add(objectDemo8);
objectDemoList.add(objectDemo9);
objectDemoList.add(objectDemo10);
return objectDemoList;
}
}
1:collection.stream().forEach() → collection.forEach()
此方法作用为对colleaction流进行遍历--->
List<ObjectDemo> objectDemoList = new ObjectDemoList().getSomeDemo();
//foreach test
objectDemoList.forEach(item -> {
System.out.println(item.toString());
});
控制台数据:

2:collection.stream().collect(toList/toSet/toCollection()) → new CollectionType<>(collection)
此方法作用为对colleaction流进行类型转换,当前为list,转化为set示例--->
List<ObjectDemo> objectDemoList = new ObjectDemoList().getSomeDemo(); //type change test of jdk8
Set<ObjectDemo> objectDemoSet = new HashSet<>(objectDemoList); objectDemoSet.forEach(item -> {
System.out.println(item.toString());
}); //type change test of jdk7
Set<ObjectDemo> objectDemoSet3 = objectDemoList.stream().collect(Collectors.toSet());
控制台数据:

3:collection.stream().toArray() → collection.toArray()
此方法作用为对colleaction流进行类型转换为array--->
此处不做控制台演示;
//cast as array test
Object[] test = objectDemoList.toArray();
Arrays.stream(test).forEach(item -> {
System.out.println(item.toString());
});
4:Arrays.asList().stream() → Arrays.stream() or Stream.of()
此方法作用为将array转换为stream流--->
//test of jdk7
Arrays.asList(test).stream();
//test of jdk8
Arrays.stream(test);
Stream.of(test);
Stream.of()底部还是由Arrays.stream()实现的,因此我们正式使用时用Arrays.stream()就行了
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
5:IntStream.range(0, array.length).mapToObj(idx -> array[idx]) → Arrays.stream(array)
同上,不做多余介绍,但是看看kdk7的写法吧
IntStream.range(0, test.length).mapToObj(id -> test[id])
.forEach(item -> {
System.out.println(item.toString());
});
6:IntStream.range(0, list.size()).mapToObj(idx -> list.get(idx)) → list.stream()
list转化为stram流,同上,不做多余介绍
7:Collections.singleton().stream() → Stream.of()
与topic4相同,但介绍一下jdk7的写法
Collections.singleton(objectDemoList).stream();
8:Collections.emptyList().stream() → Stream.empty()
源码部分:
public static<T> Stream<T> empty() {
return StreamSupport.stream(Spliterators.<T>emptySpliterator(), false);
}
作用:返回一个空stream
9:stream.filter().findFirst().isPresent() → stream.anyMatch()
判断此stream种是否存在符合条件的elem:
//test 09 of jdk8
System.out.println(objectDemoList.stream().anyMatch(objectDemo -> objectDemo.getId() > 11));
//test 09 of jdk7
System.out.println(objectDemoList.stream().findFirst().isPresent());
stream.anyMatch()源码:
boolean anyMatch(Predicate<? super T> predicate);
Predicate.test():
boolean test(T t);
作用:只要符合test,就会返回一个新的predicate;
而我在jdk8中筛选的是 objectDemo.getId() > 11 的objectDemo对象,因此不会有满足条件的objectDemo对象,验证为false;
而条件为 objectDemo.getId() > 3 时 objectDemoLis 中有满足条件 的objectDemo对象,因此不会有满足条件的objectDemo对象,验证为true;
控制台输出:

10:stream.collect(Collectors.counting()) → stream.count()
作用:计算stream内的elem数量(大小)
//test10 od jdk8 and jdk7
System.out.println(objectDemoList.stream().count());
System.out.println(objectDemoList.size());
System.out.println(objectDemoList.stream().collect(Collectors.counting()));

11:stream.collect(Collectors.maxBy()) → stream.max()
作用:返回该stream中的最大elem,前提是根据哪个属性排序,我这里使用id排序
//test11 of jdk8 and jdk7
System.out.println(objectDemoList.stream().max((o1, o2) ->
new ObjectDemoList().compare(o1, o2)
)); private Integer compare(ObjectDemo objectDemo, ObjectDemo objectDemo2) {
if (objectDemo.getId() < objectDemo2.getId()) {
return -1;
}
if (objectDemo.getId().equals(objectDemo2.getId())) {
return 0;
}
if (objectDemo.getId() > objectDemo2.getId()) {
return 1;
}
return -1;
}
stream.max()源码:
Optional<T> max(Comparator<? super T> comparator);
Comparator.compare()遇难:
源码中的介绍是这样写的
* Compares its two arguments for order. Returns a negative integer,
* zero, or a positive integer as the first argument is less than, equal
* to, or greater than the second.<p>
int compare(T o1, T o2);
compare接口方法当o1>o2时,返回负整数,o1.equal(o2)时返回0,o1>02时返回正整数;
因此我编写了一个compare方法来返回具体结果(学而不精,若有好的意见望下方留言,感谢)
控制台输出:

12:stream.collect(Collectors.mapping()) → stream.map().collect()
先讲讲map()方法的作用:个人认为是将stream中的数据做萃取,就比如我们在数据中select * from [table] 时会出现id,name,age字段,但是若我们需要单独取 id 字段时,
就要 select [table].id from [table] ;这里的map是一样的作用,为我们做数据字段筛选提供了可行条件:

13:stream.collect(Collectors.reducing()) → stream.reduce()
唯一:将stream精简到只剩一个

14:stream.collect(Collectors.summingInt()) → stream.mapToInt().sum()
作用:为每个elem或者elem中的某个属性求总和:
类似的方法还有 stream.mapToDouble().sum() 、 stream.mapToLong().sum()
//test13 of jdk8 and jdk7
System.out.println(objectDemoList.stream().map(ObjectDemo::getId).collect(Collectors.toList()));
System.out.println("sum(id)=" + objectDemoList.stream().collect(Collectors.summingInt(ObjectDemo::getId)));//jdk7
System.out.println(objectDemoList.stream().map(ObjectDemo::getClassNo).collect(Collectors.toList()));
System.out.println("sum(classNo)=" + objectDemoList.stream().mapToInt(ObjectDemo::getClassNo).sum());//jdk8
控制台输出:

15:stream.distinct
作用:去重(与sql中的distinct作用一致)
//去重前
System.out.println(objectDemoList.stream().map(ObjectDemo::getClassNo).collect(Collectors.toList()));
//去重后
System.out.println(objectDemoList.stream().map(ObjectDemo::getClassNo).distinct().collect(Collectors.toList()));
控制台输出:

16:!stream.anyMatch() → stream.noneMatch()
stream.anyMatch():stream中只要含有满足条件的elem就返回true,否则false
stream.noneMatch():stream中只要没有满足条件的elem就返回true,否则false
System.out.println(objectDemoList.stream().anyMatch(objectDemo -> objectDemo.getId() == 11));
System.out.println(objectDemoList.stream().noneMatch(objectDemo -> objectDemo.getClassNo() == 5));
控制台输出:

17:!stream.anyMatch(x -> !(...)) → stream.allMatch()
作用:全部符合条件才为true,否则为false

18:stream.sorted
作用:将elem根据某一属性进行排序(因为无法直接比较两个对象的大小)
源码中这么写的:传入的对象要有可比较性!!!
* Returns a stream consisting of the elements of this stream, sorted
* according to natural order. If the elements of this stream are not
* {@code Comparable}, a {@code java.lang.ClassCastException} may be thrown
* when the terminal operation is executed. Stream<T> sorted();

19:stream.filter()
作用:过滤掉你不需要的对象

20:stream.concat()
作用:对两个stream进行拼接并转化为一个stream
List<ObjectDemo> objectDemoList2 = new ArrayList<>();
ObjectDemo objectDemo13 = new ObjectDemo();
objectDemo13.setId(5);
objectDemo13.setName("object13");
objectDemo13.setClassNo(5);
objectDemoList2.add(objectDemo13); Stream streamT = Stream.concat(objectDemoList.stream(), objectDemoList2.stream());
System.out.println(streamT.collect(Collectors.toList()));

21:Collector.grouping()
与数据库中 的group by 一样的作用

java中的stream的泛型方法的使用示例的更多相关文章
- java中的Stream流
java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 ...
- Java中的泛型类和泛型方法区别和联系
泛型的概念大家应该都会,不懂的百度或者google,在java中泛型类的定义较为简单 <span style="font-size:18px;"><span st ...
- java中的stream的Map收集器操作
package test9; import java.util.Collections; import java.util.HashSet; import java.util.Map; import ...
- java中的泛型类和泛型方法
1.泛型是什么? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类. 可以在集合框架(Collection fram ...
- java中的stream是啥?
函数式编程的执行是惰性的,按顺序真正执行的时候才会执行相应的代码.方法: 函数式编程是安全的,用的是monad架构 1 public class StreamTest { 2 3 public sta ...
- 双层for循环用java中的stream流来实现
//双重for循环for (int i = 0; i < fusRecomConfigDOList.size(); i++) { for (int j = 0; j < fusRecomC ...
- java 中Int和Integer区别以及相关示例
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrappe ...
- Java中RSA非对称密钥加解密使用示例
一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分 ...
- Java中的泛型方法
泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}.这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类 ...
随机推荐
- Java实现动态修改Jar包内文件内容
import java.io.*; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; ...
- 基于 HTML5 的 WebGL 和 VR 技术的 3D 机房数据中心可视化
前言 在 3D 机房数据中心可视化应用中,随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的 ...
- 这段代码,c 1秒,java 9秒,c# 14秒,而python。。。
哎,不得不说最近见得键盘侠客太多了,做程序员没两天总是喜欢上嘴唇触天,下嘴唇碰地的吹. 自己分明都没用过几门语言,就对各门语言评头论足说三道四,这么语言多好那门语言有多烂. 可能是随着时间也变得没那么 ...
- webpack4配置详解之常用插件分享
前言 继上一次webpack的基础配置分享之后,本次将分享一些工作中项目常用的配置插件.也会包含一些自己了解过觉得不错的插件,如有分析不到位的,欢迎纠错,嗯,这些东西文档都有,大佬可绕过. Wepac ...
- 【Swift 4.2】uuid 取 hashCode(与 Java/Go/Kotlin 一致)
extension String { func hashCode() -> Int32 { let components = self.split(separator: "-" ...
- c++入门之函数指针和函数对象
函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性.函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a, ...
- Kubernetes — 深入解析Pod对象:基本概念(一)
在上一篇文章中,我详细介绍了 Pod 这个 Kubernetes 项目中最重要的概念. 现在,你已经非常清楚:Pod,而不是容器,才是 Kubernetes 项目中的最小编排单位.将这个设计落实到 A ...
- vue脚手架搭建项目引用百度地图--出坑
这是官网地址 https://dafrok.github.io/vue-baidu-map/#/zh/start/installation 需要声明注意的是 BaiduMap 组件容器本身是一个空的块 ...
- MySQL之InnoDB数据页结构(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
InnoDB为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做数据页. 一个数据页可以被大致划分为7个部分,分别是 File Header,表示页的一些通用信息,占固定的38字节. Pag ...
- Socket通信例子
Server端 using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...