Java业务开发常见错误( 二 )


Stream.iterate(2, item -> item * 2).limit(2).forEach(System.out::println);Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.TEN)).limit(3).forEach(System.out::println);d.通过Stream.generate方法从外部传入一个提供元素的Supplier来构造无限流,
然后使用limit限制流元素个数 。
Stream.generate(() -> "test").limit(3).forEach(System.out::println);Stream.generate(Math::random).limit(3).forEach(System.out::println);e.通过IntStream或DoubleStream构造基本类型的流
IntStream.range(1, 5).forEach(System.out::println);DoubleStream.of(1.1, 2.2, 3.3).forEach(System.out::println);4、filter 过滤可以实现过滤操作,类似SQL中的where,可以连续叠加filter方法进行多次过滤 。
orders.stream().filter(order -> order.getTotalPrice() > 40).filter(order -> order.getCustomerId() == 1).forEach(System.out::println);5、map 转换可以做转换(就是投影),类似于SQL中的select 。
通过map,可以把对象转换成其他对象 。
a、小写转大写
List<String> a = Arrays.asList("a", "b", "c", "d");List<String> b = a.stream().map(String::toUpperCase).collect(Collectors.toList());System.out.println(a);System.out.println(b);b、对象列表转字符串列表
List<String> collect = orders.stream().map(x -> x.getCustomerName()).collect(Collectors.toList());System.out.println(collect);c、对象列表转其他对象列表
List<User> users = customers.stream().map(temp -> {User user = new User();user.setCustomerId(temp.getId());user.setName(temp.getName());return user;}).collect(Collectors.toList());6、flatMap 展开相当于 map + flat,通过map把每一个元素替换成一个流,然后展开这个流 。
7、sorted 排序可以用于排序,类似于SQL中的 order by 。
orders.stream().filter(order -> order.getTotalPrice() > 40).sorted(Comparator.comparing(Order::getTotalPrice).reversed()).limit(2).forEach(System.out::println);8、distinct 去重作用是去重,类似于SQL中的distinct 。
List<String> list = Arrays.asList("AA", "BB", "CC", "AA", "BB");System.out.println(list);//[AA, BB, CC, AA, BB]List<String> collect = list.stream().distinct().collect(Collectors.toList());System.out.println(collect);//[AA, BB, CC]9、skip 和 limit 分页用于分页,类似于MySQL中的limt 。
skip实现跳过一定的项,limit用于限制项总数 。
customers.stream() .sorted(Comparator.comparing(Customer::getId).reversed()).map(customer -> customer.getId() + "@" + customer.getName()).limit(2).forEach(System.out::println);//10@姓名10//9@姓名9customers.stream() .sorted(Comparator.comparing(Customer::getId).reversed()).map(customer -> customer.getId() + "@" + customer.getName()).skip(2).limit(2).forEach(System.out::println);//8@姓名8//7@姓名710、collect 收集收集操作,对流程进行终止操作 。(终止意思是,后面无法再串联其他操作)
其他终止操作还有 forEach,toArray,min,max,cout,anyMatch等等 。
#所有下单的用户,使用toSet去重后实现字符串的拼接String collect = orders.stream().map(order -> order.getCustomerName()).collect(Collectors.toSet()).stream().collect(Collectors.joining(",", "[", "]"));System.out.println(collect);//[李四,张三]#使用toCollection收集器指定集合类型LinkedList<Order> collect = orders.stream().limit(2).collect(Collectors.toCollection(LinkedList::new));System.out.println(collect);Collectors类的一些常用静态方法:

Java业务开发常见错误

文章插图
 
【注意】Lambda表达式有个很大的缺点,就是不方便调试 。
【Java业务开发常见错误】【解决】
1、使用2020.01版本的IDEA编辑器
https://www.jetbrains.com/help/idea/analyze-java-stream-operations.html
2、使用peek方法
3)Optional类型4)并行流5)日期时间类1、简单介绍在Java8之前处理日期时间时,使用Date,Calender 和 SimpleDateFormat,使用不方便 。
而且无法申明时区 。
 2、项目背景背景:
去年做的realme的pk大赛,服务器使用的是utc时间(世界标准时间),而Pk赛是印度的项目,业务逻辑需要使用印度时间 。
解决:
写了一个UTC转印度时间的工具类,把new出来的时间往后加五个半小时,就是印度时间 。
https://shimo.im/docs/yJggDyvktT8DJdhc/ 《【pk大赛】服务器UTC时间解决方案》


推荐阅读