java吧 关注:1,253,014贴子:12,739,236
  • 3回复贴,共1

##我在工作中用到的Java8

只看楼主收藏回复

在工作中,陆陆续续使用到了Java8的新技术,其中流使用的最多,在处理集合方面非常方便,下面是是我工作中常用到的Java8的功能。
Lambda表达式和forEach循环
if (CollectionUtils.isNotEmpty(prizes)) {
prizes.forEach(x -> {
if (PrizeType.BOOK.equals(x.getPrizeType())) {
books.add(getByActivityId(x.getPrizeId()));
}
});
}
当循环遍历的数据很多时(1000条以上),Java8中的for循环功能能要强于普通的for循环。
集合创建
if (CollectionUtils.isEmpty(memberList)) {
return ImmutableList.of();
}
使用Guava的ImmutableList.of()创建的是不可变集合,这样有利于节省空间。
Java8常用的集合操作
//filter过滤
List<RedeemActivity> redeemActivitiesOfPrize = activities.stream()
.filter(x -> activityIdsOfPrize.contains(x.getId())).collect(Collectors.toList());
//使用流降序排序
userCOS.stream() .sorted(Comparator.comparing(userCO::getCreateDate).reversed()).collect(Collectors.toList());
//通过昵称获取userId列表
List<String> userIds = users.stream().collect(() -> new ArrayList<String>(), (list, user) -> list.add(user.getId()), (list1, list2) -> list1.addAll(list2));
List<String> orderNos = orderStatus.stream().map(OrderDetail::getOrderNo).collect(toList());
//Optional.ofNullable使用
List<CommodityActivityRule> excludedCommodityActivityRules = Optional.ofNullable(commodityActivityRules)
.orElseGet(ArrayList::new).stream()
// 排除当前活动
.filter(commodityActivityRule -> !commodityActivityRule.getActivity().getId().equals(activityId))
.collect(Collectors.toList());
//对象不为null时使用of,对象可能为null也可能不为null时用ofNullable
//orElseGet:对象不为null不会重新创建;orElse:对象为不为null也会重新创建
Optional.of(marketingConfigRepository.listAll(new MarketingConfig())).orElseGet(ArrayList::new).stream()
.filter(marketingConfig -> excludedMarketingConfigTypes.contains(marketingConfig.getType()))
.map(MarketingConfig::getId).collect(Collectors.toList());
//返回对象的时候可以用
Optional.ofNullable(usageRules).orElseGet(ArrayList::new)
//BigDecimal累加
BigDecimal commodityAmount = orderDetails.stream().map(OrderDetail::getCommodityAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
//判断Optional里面是否有值
Optional<GradeThresholdInfoCO> nextOptional = gradeThresholdList.stream().filter(x -> x.getLevel() != null && x.getLevel() == level + 1).findFirst();
if (nextOptional.isPresent()) {
return nextOptional.get();
}
//findFirst()
List<Cookie> targetCookies = Optional.ofNullable(cookies).orElseGet(ArrayList::new).stream()
.filter(e -> "jsessionid".equalsIgnoreCase(e.getName())).collect(Collectors.toList());
log.info("Cookie名称为:{}的值为:{}", "jsessionid",
Optional.ofNullable(targetCookies).orElseGet(ArrayList::new).get(0).getValue());
Optional<Cookie> first = Optional.ofNullable(cookies).orElseGet(ArrayList::new).stream()
.filter(e -> "jsessionid".equalsIgnoreCase(e.getName())).findFirst();
if (first.isPresent()) {
log.info("Cookie名称为:{}的值为:{}", "jsessionid",
first.get().getValue());
}
//流大小比较
Optional<Optional<Integer>> maxLevelOptional = ruleList.stream().map(x -> x.getEarningRuleMap().keySet().stream().max((o1, o2) -> o1.compareTo(o2))).max((o1, o2) -> {
Integer value1 = o1.isPresent() ? o1.get() : 0;
Integer value2 = o2.isPresent() ? o2.get() : 0;
return value1.compareTo(value2);
});
//日期获取最值(最大,最小)
Optional<ActivityVO> max = activityVOS.stream().max(Comparator.comparing(ActivityVO::getEndDate));
Optional<ActivityVO> min = activityVOS.stream().min(Comparator.comparing(ActivityVO::getStartDate));
Date maxEndDate = max.get().getEndDate();
Date minStartDate = min.get().getStartDate();
//groupingBy分组1
Map<PrizeType, List<RedeemActivityPrize>> prizeTypeAndPrizesMap = redeemActivityPrize.stream().collect(Collectors.groupingBy(RedeemActivityPrize::getPrizeType));
List<RedeemActivityPrize> couponPrizes = prizeTypeAndPrizesMap.get(PrizeType.COUPON);
List<RedeemActivityPrize> presentPrizes = prizeTypeAndPrizesMap.get(PrizeType.PRESENT);
//groupingBy分组2
prizes.stream().collect(Collectors.groupingBy(RedeemActivityPrize::getPrizeId))
.forEach((prizeId, activityPrizes) -> {
List<String> activityIdsOfPrize = activityPrizes.stream()
.map(RedeemActivityPrize::getRedeemActivityId).collect(Collectors.toList());
List<RedeemActivity> redeemActivitiesOfPrize = activities.stream()
.filter(x -> activityIdsOfPrize.contains(x.getId())).collect(Collectors.toList());
List<RedeemActivityBriefCO> briefCOS = ModelConvertorHelper.convertList(redeemActivitiesOfPrize,
RedeemActivityBriefCO.class);
RedeemUsedPresentCO co = new RedeemUsedPresentCO();
co.setPresentId(prizeId);
co.setActivities(briefCOS);
result.add(co);
});
//Java8 Function函数的使用
//T-入参类型,R-出参类型
private static <T, R> List<R> transform(List<T> list, Function<T, R> fx) {
List<R> result = new ArrayList<>();
for (T element : list) {
result.add(fx.apply(element));
}
return result;
}
List<Integer> namesLength = transform(names, String::length);
//集合添加..
Stream.of(task1, task2, task3, task4, task5).collect(toList())
//显示前几位的集合数据
tasks.stream().filter(task -> task.getType() == TaskType.READING).sorted(comparing(Task::getCreatedOn)).map(Task::getTitle).
limit(n).collect(toList());
//Java8循环遍历
couponIds.forEach(x -> {
RedeemActivityPrize presentRedeem = new RedeemActivityPrize();
presentRedeem.setRedeemActivityId(redeemActivityId);
presentRedeem.setPrizeType(PrizeType.COUPON);
presentRedeem.setPrizeId(x);
redeemActivityPrizeList.add(presentRedeem);
});
Java8 List转Map
//1.这里有个实体对象(员工对象)
public class Employee {
// member variables
private int empId;
private String empName;
private int empAge;
private String empDesignation;
//2.比如将员工对象的empId作为key,值是员工姓名
Map<Integer, String> mapOfEmployees = employees.stream().collect(
Collectors.toMap(e -> e.getEmpId(),e -> e.getEmpName()));
//3.Map的Key是empId,整个对象为Map的值,但如果List中有重复的empId,映射到Map时,Key是不能重复的
Map<Integer, String> mapOfEmployees = employees.stream().collect(
Collectors.toMap(
e -> e.getEmpId(),
e -> e.getEmpName(),
(e1, e2) -> e1 )); // Merge Function
//4.将List转换为Map - 使用TreeMap对键进行自然排序
Map<Integer, String> mapOfEmployees = employees.stream().collect(
Collectors.toMap(
e -> e.getEmpId(),
e -> e.getEmpName(),
(e1, e2) -> e1 , // Merge Function
TreeMap<Integer, String>::new)); // Map Supplier
//如果你的TreeMap实现需要加入比较器,将上面代码中TreeMap<Integer, String>::new替换成:() -> new TreeMap<Integer, String>(new MyComparator())


IP属地:湖南1楼2020-07-23 16:59回复
    有兴趣关注一波,互相学习


    IP属地:湖南来自iPhone客户端3楼2020-07-24 13:33
    回复
      Java进阶学习的知识
      并发编程
      多线程内存模型
      Java线程
      volatile关键字
      指令重排
      可见性
      原子性
      同步相关
      synchronized关键字
      AQS详解
      乐观锁、悲观锁、可重入锁、公平锁等
      ReentranLock
      ThreadLocal
      AQS并发包
      CountDownLatch
      Semaphore
      CyclicBarrier
      atomic原子操作
      atomic类
      CAS乐观锁、ABA问题
      CAS底层相关Unsafe类
      阻塞队列
      有界队列
      ArrayBlockingQueue
      ConcurrentLinkedQueue
      无界队列
      PriorityBlockingQueue
      DelayQueue
      并发Map
      HashMap与ConcurrentHashMap
      Executor线程池
      Future
      ThreadPoolExecutorService
      线程池核心参数、拒绝策略
      ForkJoin框架
      源码分析
      Java类源码
      HashMap
      ThreadLocal
      ArrayList
      框架源码
      Spring
      IoC
      容器设计原理
      Bean生命周期
      Spring Context装载过程
      FactoryBean与BeanFactory
      Aop
      Aop注解编程
      @EnableAspectJAutoProxy
      @Before/@After/@Around
      @Pointcut
      Aop源码
      事务控制
      @EnableTransactionManagement
      @Transactional
      MyBatis
      核心应用配置
      与Spring集成
      核心类
      Configuration
      Mapper
      SqlSession
      Executor
      手写MyBatis
      初始化流程
      二级缓存
      最终手写
      Netty
      网络与IO模型
      BIO与NIO与AIO
      Netty线程模型及源码
      高性能序列化协议
      粘包拆包现象解决办法
      Netty心跳机制
      直接内存与零拷贝
      Netty相关项目
      设计模式
      设计原则
      开闭、单一职责原则...
      创建型模式
      工厂、抽象工厂、单列模式
      建造者、原型模式
      结构型模式
      适配器、装饰器、代理模式
      外观、桥接、组合、享元模式
      行为模式
      模板方法、策略、观察者模式
      迭代器、责任链、命令、中介者模式
      备忘录、状态、访问者、解释器模式
      数据库
      MySQL
      索引,锁
      事务隔离级别
      调优
      分库分表
      程序员的工具箱
      Git
      Maven
      Jenkins
      Linux
      算法与数据结构
      算法复杂度
      线性表,链表
      队列,栈
      基础排序算法
      进阶排序:快速排序,归并排序
      二分搜索,Hash表
      树,二叉树,BTree,B+Tree
      图,广度优先遍历,深度优先遍历
      最小树,最短路径
      位图
      中间件
      消息中间件
      Rabbitmq
      高可用集群部署
      消息分发
      消息路由
      消息确认
      镜像队列
      RocketMq
      集群部署
      普通消息,顺序消息,事务消息,定时消息
      API使用
      Kafka
      技术选型(与其他消息中间件对比)
      集群搭建
      副本机制,选举原理
      消息丢失,重复消费,顺序消费
      存储中间件
      Redis
      数据结构
      使用场景
      分布式锁
      分布式缓存
      延迟队列
      电商场景:如统计
      持久化机制,安全机制
      主从集群,分片集群
      客户端使用
      缓存穿透,缓存雪崩,缓存击穿
      布隆过滤器
      性能优化
      MongoDB
      高可用集群
      集合,索引文档
      实践
      FastDFS
      分布式部署及其使用
      ElasticSearch
      ELK使用
      高级查询
      底层原理
      协调中间件
      Zookeeper
      集群部署
      使用场景
      注册中心
      配置中心
      分布式锁
      znode,watcher,ACL
      Dubbo
      部署使用
      调用模块原理
      容错机制
      RPC底层原理
      负载均衡策略
      后台监控
      微服务
      SpringBoot源码解析
      Spring Cloud Alibaba
      注册中心Nacos
      负载均衡Ribbon
      远程调用Feign
      限流降级熔断Sentinel
      统一网关Gateway
      统一配置Nacos
      分布式事务Seata
      权限控制
      Spring Cloud Netflix
      Eureka服务注册
      Ribbon负载均衡
      Feign声明式服务调用
      Hystrix服务限流,降级,熔断
      Zuul统一网关
      Congfig分布式配置中心
      Sleuth分布式链路跟踪
      容器化
      Docker
      镜像,仓库,容器
      环境搭建
      DockerFile
      DockerCompose
      服务编排
      Kubernetes
      集群搭建


      IP属地:湖南4楼2020-08-01 11:38
      回复