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的具体类 ...
随机推荐
- vue-electron脚手架安装及说明 打包基于Vue的 桌面应用程序
今天这篇文章是讲述一下 融合了vue-cli+electron的一种新的脚手架,省去许多繁琐配置,即vue-electron. 下面就说一下安装和使用,假设你的电脑已经安装node.js,并且已经全局 ...
- BEX5下实现鼠标滚动滚动条
使用前提: 页面内容过多,默认的滚动条太难看,在不引入滚动条插件情况下让界面不使用滚动条,又能通过鼠标滚动 实现步骤: 1 在会出现滚动条的组件上设置隐藏滚动条 overflow:hidden; 2 ...
- LODOP中ADD_PRINT_TABLE、HTM、HTML表格自动分页测试
LODOP中超文本超过打印项高度会自动分页,那么对于超大行,该行处在分页高度位置会怎样呢?本文用来测试一下三个语句对html中table中超大行在分页高度位置的处理. 测试结果:ADD_PRINT_T ...
- Codeforces484 A. Bits
题目类型:位运算 传送门:>Here< 题意:求区间\([L,R]\)内二进制中1的个数最多的那个数,如果有多解输出最小解 解题思路 想了15min就一遍A了 我们可以贪心地在\(L\)的 ...
- rest framework 序列化
serializers 序列化组件 可以实现很轻松的互相转换,最常用的组件 ,用量最大的组件 源码位置 rest_framework.serializers 源码中需要用到的 rest_fram ...
- 帝国cms打开慢
发现有个站(http://www.953239.com/)打开很慢,改了php版本后,快了一倍
- 一文读懂ES6(附PY3对比)
Ⅰ.ES6~POP¶ 代码示例:https://github.com/lotapp/BaseCode/tree/master/javascript/1.ES6 在线演示:https://githu ...
- C++中使用vector.erase()需要注意的事项
本人菜鸟一枚.. 今天在用vector.erase()的时候,发现总是不能把应该erase掉的东西erase干净. 举个栗子: vector<int> num_vec; num_vec.p ...
- JS 防抖函数和节流函数
文章转载自:木上有水 什么是防抖?什么是节流? 工作中我们经常会用一些方法监听某些事件的完成,比如scroll.resize.keyup等. 常规事件触发的时候,比如scroll,会在短时间内触发多次 ...
- GWAS文献解读:The stability of educational achievement across school years is largely explained by genetic factors
方法 从NPD(英国数据库,收集有关学生在学年中学业成绩的数据)和TEDS(英国国家课程指南报告成绩数据库,由国家教育研究基金会和资格与课程管理局制定标准化核心学术课程)数据库获得双胞胎的学业成绩数据 ...