栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDK1.8神器之stream流

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDK1.8神器之stream流

JDK1.8神器之stream流
  • Stream流的简单使用
    • Stream流之过滤
    • Stream流之去重
    • Stream流之统计
    • Stream流之求和
      • 对list中的值求和/平均数/最大值/最小值
      • 对list中对象的某个属性的值求和
    • Stream流之获取平方
    • Stream流之list 转为 Map
    • Stream流之数据转换
      • Stream流之大小写转换
      • Stream流之转换数据类型
    • Stream流之limit
      • Stream流之limit - 获取前 n 条数的数据
      • Stream流之limit - 结合 skip 使用得到需要的数据
    • Stream流之排序sort
      • Stream流之随机取值排序
      • Stream流之优化排序==先获取在排序效率会更高!==
    • Stream流之 groupingBy/partitioningBy 使用
      • Stream流之分组排序
      • Stream流之分区排序
    • Stream 流之去重/最大值/最小值
      • Stream 流之最大值-max
      • Stream 流之最小值-min
      • Stream 流之去重-distinct

Stream流的简单使用
    在我们对项目优化的时候,除了代码的优化,SQL优化是必不可缺的,当我们为了性能把一些SQL  
的函数和一些逻辑去除之后,那么这时我们就需要在代码中去处理数据,在我自己日常工作中对数据
处理部分用Stream流还是比较多的,所以把自己日常用的一些小例子推荐给大家!
Stream流之过滤
// 过滤小例子
PropertyDescriptor nickName = Arrays.asList(Introspector.getBeanInfo(fieldClass).getPropertyDescriptors())
                                    .stream().filter(pro -> pro.getName().equals("nickName")).collect(Collectors.toList()).get(0);
Stream流之去重
// 去重小例子
List departmentList = userList.stream().map(User::getDepartment).distinct().collect(Collectors.toList());
Stream流之统计
// 统计小例子
Long ageNum = userList.stream().filter(user -> user.getAge() >= 28).count();
Long departNum = userList.stream().filter(user -> user.getDepartment() == "人事部").collect(Collectors.counting());
 //统计薪资大于3500元的人数
Long erNum= userList.stream().filter(user -> user.getSalary().compareTo(BigDecimal.valueOf(3500)) == 1).count();
Stream流之求和 对list中的值求和/平均数/最大值/最小值
//对list中的值求和小例子
Map reasonMap = xxxMapper.countReason(requestxxxDTO);
//由于map中的value值都为Integer 所以这里我直接强转了,如果你所用的数据不是数值类型记着注意转换类型问题
List values = (List) reasonMap.values();
IntSummaryStatistics summaryStatistics = values.stream().mapToInt((s) -> s).summaryStatistics();

System.out.println("总条数:" + summaryStatistics.getSum());
System.out.println("平均数:" + summaryStatistics.getAverage());
System.out.println("总个数:" + summaryStatistics.getCount());
System.out.println("最大值:" + summaryStatistics.getMax());
System.out.println("最小值:" + summaryStatistics.getMin());
对list中对象的某个属性的值求和
//对list中的值求和小例子
List users = new ArrayList<>();
User user = new User();
user.setAge(18);
userList.add(user);
User user1 = new User();
user1.setAge(20);
userList.add(user1);
User user2 = new User();
user2.setAge(22);
userList.add(user2);
int ageSum = users.stream().collect(Collectors.summingInt(User::getAge));
System.out.println("所有用户年龄总和:" + ageSum);
Stream流之获取平方
//获取平方
List list = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
List list1 = list .stream().map(n -> n * n).collect(Collectors.toList());
System.out.println("平方的数据:" + list1 );
Stream流之list 转为 Map
//将list转为Map
List list = new ArrayList();  
list.add(new User("001", "小A"));  
list.add(new User("002", "小B"));  
list.add(new User("003", "小C"));

Map map = list.stream().collect(Collectors.toMap(User::getId, User::getName));
用Collectors的toMap方法转换List,一般会遇到两个问题。一个是转换map,key重复问题;另一个是空指针异常,即转为map的value是null。
Stream流之数据转换 Stream流之大小写转换
//大小写转换小例子
List list3 = Arrays.asList("hong", "lv", "hei");
System.out.println("转换前:" + list3);
List list4 = list3.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println("转换后:" + list4); 
转换后:[HONG,LV,HEI]
Stream流之转换数据类型
//数据类型转换小例子
List list = Arrays.asList("1", "2", "3");
System.out.println("转换前:" + list);
List list1 = list31.stream().map(Integer::valueOf).collect(Collectors.toList());
System.out.println("转换后:" + list1); 
Stream流之limit
limit 方法用于获取指定数量的流。
Stream流之limit - 获取前 n 条数的数据
//获取前 n 条数的数据
Random rd = new Random();
System.out.println("取到的前n条数据:");
rd.ints().limit(n).forEach(System.out::println);
Stream流之limit - 结合 skip 使用得到需要的数据
skip 表示的是扔掉前 n 个元素。 
//结合 skip 使用得到需要的数据
List list9 = new ArrayList();

for (int i = 1; i < 4; i++) {
    User user = new User(i, "pancm" + i);
    list9.add(user);
}
System.out.println("截取之前的数据:");
// 取前3条数据,但是扔掉了前面的2条,可以理解为拿到的数据为 2<=i<3 (i 是数值下标)
List list10 = list9.stream().map(User::getName).limit(3).skip(2).collect(Collectors.toList());
System.out.println("截取之后的数据:" + list10);
Stream流之排序sort Stream流之随机取值排序
//随机取值排序小例子
Random rd = new Random();
System.out.println("取到的前三条数据然后进行排序:");
rd.ints().limit(3).sorted().forEach(System.out::println);
//取到的前三条数据然后进行排序:
//-20434563
//-17785957
//10133695
Stream流之优化排序先获取在排序效率会更高!
//优化排序小例子 
//普通的排序取值
List list11 = list9.stream().sorted((u1, u2) -> u1.getName().compareTo(u2.getName())).limit(3)
        .collect(Collectors.toList());
System.out.println("排序之后的数据:" + list11);
//优化排序取值
List list12 = list9.stream().limit(3).sorted((u1, u2) -> u1.getName().compareTo(u2.getName()))
        .collect(Collectors.toList());
System.out.println("优化排序之后的数据:" + list12);
//排序之后的数据:[{"id":1,"name":"pancm1"}, {"id":2,"name":"pancm2"}, {"id":3,"name":"pancm3"}]
//优化排序之后的数据:[{"id":1,"name":"pancm1"}, {"id":2,"name":"pancm2"}, {"id":3,"name":"pancm3"}]
Stream流之 groupingBy/partitioningBy 使用 Stream流之分组排序
 //分组排序小例子
System.out.println("通过id进行分组排序:");
Map> personGroups = Stream.generate(new UserSupplier2()).limit(5)
        .collect(Collectors.groupingBy(User::getId));
Iterator it = personGroups.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry> persons = (Map.Entry) it.next();
    System.out.println("id " + persons.getKey() + " = " + persons.getValue());
}

//通过id进行分组排序:
//id 10 = [{"id":10,"name":"pancm1"}]    
//id 11 = [{"id":11,"name":"pancm3"}, {"id":11,"name":"pancm6"}, {"id":11,"name":"pancm4"}, {"id":11,"name":"pancm7"}]

class UserSupplier2 implements Supplier {
    private int index = 10;
    private Random random = new Random();

    @Override
    public User get() {
        return new User(index % 2 == 0 ? index++ : index, "pancm" + random.nextInt(10));
    }
}

Stream流之分区排序
// 分区排序小例子
System.out.println("通过年龄进行分区排序:");
Map> children = Stream.generate(new UserSupplier3()).limit(5)
        .collect(Collectors.partitioningBy(p -> p.getId() < 18));

System.out.println("儿童: " + children.get(true));
System.out.println("成人: " + children.get(false));

// 通过年龄进行分区排序:
// 儿童: [{"id":16,"name":"xx"}, {"id":17,"name":"yy"}]
// 成人: [{"id":18,"name":"xs"}, {"id":19,"name":"xa"}, {"id":20,"name":"xz"}]

 class UserSupplier3 implements Supplier {
    private int index = 16;
    private Random random = new Random();

    @Override
    public User get() {
        return new User(index++, "pancm" + random.nextInt(10));
    }
}
Stream 流之去重/最大值/最小值 Stream 流之最大值-max
// 获取list中最大值小例子
//最长字符的长度String::length
int maxLines = list13.stream().mapToInt(String::length).max().getAsInt();
Stream 流之最小值-min
// 获取list中最小值小例子
//最小字符的长度String::length
int maxLines = list13.stream().mapToInt(String::length).min().getAsInt();
Stream 流之去重-distinct
// 对list数据去重小例子
String lines = "good good study day day up";
List list14 = new ArrayList();
list14.add(lines);
List words = list14.stream().flatMap(line -> Stream.of(line.split(" "))).filter(word -> word.length() > 0)
        .map(String::toLowerCase).distinct().sorted().collect(Collectors.toList());
System.out.println("去重复之后:" + words);
 总结的不算太全,但是工作中需要的应该差不多全了,如果有需要没有,可以私信我。
 谢谢大家
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/271104.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号