Java 8 新特性 Stream
Siona
Java 8 新特性 Stream
只符合所筛选条件至多一条
CommonArea l = common.stream().filter(item ->item.getName().equals("aa")).findAny().orElse(null);
返回多条记录
List<Object> list = common.stream().filter(item -> item.getName().equals("aa"))
.collect(Collectors.toList())
根据条件判断是否存在
anyMatch
:只要有一个就会返回 true
。
boolean exist = userData.userList.stream()
.anyMatch(u -> u.getUserName().equals(user.getUserName()));
allMatch
:所有元素都满足就返回 true。
boolean exist = userData.userList.stream()
.allMatch(u -> u.getUserName().equals(user.getUserName()));
提取对象 List 中的某一字段生成新的 List
List<String> bkMajor = list.stream()
.map(ZsbBkSchool::getBkMajor)
.collect(Collectors.toList());
// 需要将该字段 去重 后生成新的字段
List<String> bkMajor = list.stream()
.map(ZsbBkSchool::getBkMajor)
.distinct()
.toList(); // .toList() 等价于 .collect(Collectors.toList())
// 升级:Set 天然不支持重复
提取对象 List 中的某几个字段生成新的 List
List<UserVO> bkMajor = list.stream().map(user -> {
UserVO vo = new UserVO();
vo.setUserId(user.getUserId());
vo.setUserName(user.getUserName());
return vo;
}).collect(Collectors.toList());
List 集合转字符串,逗号隔开
// 如何把list集合拼接成以逗号分隔的字符串 a,b,c
List<String> list = Arrays.asList("a", "b", "c");
// 第一种方法,可以用stream流
String join = list.stream().collect(Collectors.joining(","));
System.out.println(join); // 输出 a,b,c
// 第二种方法,其实 String 也有 join 方法可以实现这个功能
String join = String.join(",", list);
System.out.println(join); // 输出 a,b,c
List 选取两个字段转 Map
Map<Integer, String> map = list.stream().collect(Collectors.toMap(Entity::getId, Entity::getType));
// 上面的代码可能会报错(value 为 null 时)
Map<Integer, String> map = list.stream().collect(HashMap::new, (k, v) -> k.put(v.getId(), v.getType),HashMap::putAll);
List 选取一个字段作为 key,value 为对象,转为 Map
// 选取一个字段作为 key,value 为对象,转为 Map
Map<Integer, Object> map = list.stream().collect(HashMap::new, (k, v) -> k.put(v.getJobId(), v), HashMap::putAll);
List 选取某一个字段作为key,value 为对象转为 Map
// 使用 Lambda 表达式
Map<Integer,User> userMap = userList.stream().collect(Collectors.toMap(User::getId, User -> User));
// 使用 Function.identity() 简洁写法,也是返回对象本身
Map<Integer,User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
// 当 key 冲突的解决办法,这里选择第二个 key 覆盖第一个 key
Map<Integer,User> userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key2));
List 选取某一个字段作为key,value 为 JSON 字符串
Map<String, String> collect = userList.stream().collect(Collectors.toMap(User::getOpenId, JSON::toJSONString));
List 选取某一个 BigDecimal 字段或其他数值字段进行相加
// 使用Stream的reduce方法将BigDecimal字段的值相加
BigDecimal sum = numbers.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 使用Stream的mapToInt和sum方法对Item对象的price字段进行累加
BigDecimal total = items.stream()
.map(Item::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
List<Integer>
使用 stream 进行去重
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5, 6, 6, 7);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
JSONArray jsonArray = new JSONArray();
Map<LocalDate,JSONObject> map = new HashMap<>();
Map<String,JSONObject> jobMap = new HashMap<>();
statisticalDailyList.forEach(statisticalDaily -> {
LocalDate date = statisticalDaily.getDate();
JSONObject obj = map.get( date);
if (obj == null) {
obj = new JSONObject();
obj.put("date", date.toString());
map.put( date, obj);
jsonArray.add( obj);
// 工序
JSONArray jobArray = new JSONArray();
for (Job job : jobList) {
JSONObject jobObj = new JSONObject();
jobObj.put("jobId", job.getDataId());
jobObj.put("jobName", job.getJobName());
jobObj.put("num", 0);
jobObj.put("defect", 0);
jobArray.add(jobObj);
jobMap.put( date + "/" + job.getDataId(), jobObj);
}
obj.put("job", jobArray);
}
JSONObject jobObj = jobMap.get( date + "/" + statisticalDaily.getJobId());
jobObj.put( "num", statisticalDaily.getTotal());
jobObj.put( "defect", statisticalDaily.getDefect());
});