文章目录
1. double值返回0.0与返回null
当所有值全为null时,相加需要返回null,而不是返回0.0
List<Cats> lists = Lists.newArrayList();
// lists.add(Cats.builder().name("1").age(6.66d).build());
// lists.add(Cats.builder().name("2").age(0.235d).build());
// lists.add(Cats.builder().name("3").age(null).build());
lists.add(Cats.builder().name("1").age(null).build());
lists.add(Cats.builder().name("2").age(null).build());
lists.add(Cats.builder().name("3").age(null).build());
double sum = lists.stream().filter(i -> Objects.nonNull(i.getAge())).mapToDouble(Cats::getAge).sum();
System.out.println("Result sum: " + sum);
OptionalDouble sumOptional = lists.stream().filter(i -> Objects.nonNull(i.getAge()))
.mapToDouble(Cats::getAge).reduce(Double::sum);
Double result = sumOptional.isPresent() ? sumOptional.getAsDouble() : null;
System.out.println("Result sum: " + result);
Result sum: 0.0
Result sum: null
2. 日期格式标准化
输入日期不是yyyy-MM-dd,转成yyyy-MM-dd
String dateString1 = "2023-1-5";
String dateString2 = "2023-11-5";
String dateString3 = "2023-1-15";
String dateString4 = "2023-11-15";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-M-d");
try {
Date parse1 = dateFormat.parse(dateString1);
Date parse2 = dateFormat.parse(dateString2);
Date parse3 = dateFormat.parse(dateString3);
Date parse4 = dateFormat.parse(dateString4);
dateFormat.applyPattern("yyyy-MM-dd");
System.out.println(dateFormat.format(parse1));
System.out.println(dateFormat.format(parse2));
System.out.println(dateFormat.format(parse3));
System.out.println(dateFormat.format(parse4));
} catch (ParseException e) {
throw new RuntimeException(e);
}
2023-01-05
2023-11-05
2023-01-15
2023-11-15
3. stream流add操作
按照id分组,对id一样的数据相加,存放于map
@Test
public void test() {
List<AdminOrgInfo> adminOrgInfoList = new ArrayList<>();
BigDecimal b1 = new BigDecimal(1);
BigDecimal b2 = new BigDecimal(2);
BigDecimal b3 = new BigDecimal(3);
BigDecimal b4 = new BigDecimal(4);
AdminOrgInfo c1 = new AdminOrgInfo("a1", b1);
AdminOrgInfo c2 = new AdminOrgInfo("a1", b2);
AdminOrgInfo c3 = new AdminOrgInfo("a2", b3);
AdminOrgInfo c4 = new AdminOrgInfo("a2", b4);
adminOrgInfoList.add(c1);
adminOrgInfoList.add(c2);
adminOrgInfoList.add(c3);
adminOrgInfoList.add(c4);
Map<String, BigDecimal> collect = adminOrgInfoList.stream().collect(toMap(AdminOrgInfo::getId, AdminOrgInfo::getNum, BigDecimal::add));
System.out.println(collect);
}
@Data
@AllArgsConstructor
class AdminOrgInfo {
private String id;
private BigDecimal num;
}
3. stream流list合并
stream中map返回的是一个list,返回值合并为list,使用flatMap
List<Statuss> lists=new ArrayList<>();
List<Integer> list=new ArrayList<>();
list.add(66);
list.add(33333);
Statuss statuss=new Statuss();
statuss.setName("aa");
statuss.setAge(list);
List<Integer> collect=lists.stream().map(Statuss::getAge).flatMap(Collection::stream).collect(toList());
@Data
class Statuss {
private String name;
private List<Integer> age;
}
4. stream流实现对list分组
4.1 取余的方式分组
List<String> originalList = Arrays.asList("元素1", "元素2", "元素3", "元素4", "元素5");
int limit = 4;
List<List<String>> res = originalList.stream()
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(element -> originalList.indexOf(element) % limit),
map -> new ArrayList<>(map.values())
));
System.out.println(res);
输出:
[[元素1, 元素5], [元素2], [元素3], [元素4]]
4.2 分页的方式分组
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
int MAX_NUMBER = 3;
int limit = (list.size() + MAX_NUMBER - 1) / MAX_NUMBER;
List<List<Integer>> splitList = Stream.iterate(0, n -> n + 1)
.limit(limit)
.map(a -> list.stream().skip(a * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList()))
.collect(Collectors.toList());
System.out.println(splitList);
输出:
[[1, 2, 3], [4, 5, 6], [7]]
5. 获取当天的GMT 0点时间
ZoneId zoneId = ZoneId.of("GMT+8");
ZonedDateTime now = ZonedDateTime.now(zoneId);
LocalDate today = now.toLocalDate();
Date todayGMTZeroTime = Date.from(today.atStartOfDay(zoneId).toInstant());