• Java stream的常见用法


    不讲原理,只说用法。

    1,集合遍历

    public class StreamTest {
    
        public static void main(String[] args) {
            //1 遍历
            
            List<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("bbb");
            //使用lambda表达式输出list中的每个值
            list.forEach(c->{
                System.out.println(c);
            });
            //调用方法
            list.forEach(StreamTest::showList);
        }
        
        public static void showList(String value) {
            System.out.println(value);
        }
    }

    2,筛选集合

     List<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("absc");
            list.add("bbb");
            
           List<String> selectResult = list.stream().filter(value->{
               return value.startsWith("a"); 
            }).collect(Collectors.toList());

    4,筛选并去重

    List<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("aaa");
            list.add("absc");
            list.add("bbb");
            
           List<String> selectResult = list.stream().filter(value->{
               return value.startsWith("a"); 
            }).distinct().collect(Collectors.toList());

    5,截断流  取出结果的前n个元素

     List<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("aaa");
            list.add("absc");
            list.add("bbb");
            
           List<String> selectResult = list.stream().filter(value->{
               return value.startsWith("a"); 
            }).limit(3).collect(Collectors.toList());
    

    6,跳过元素,它和limit是互补的

     List<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("aaa");
            list.add("absc");
            list.add("bbb");
            
           List<String> selectResult = list.stream().filter(value->{
               return value.startsWith("a"); 
            }).skip(3).collect(Collectors.toList());

    7,映射,对集合的每个元素操作,比如获取背包中所有物品的数量

            List<Long> countList = role.getBag().getBagMap().values().stream().map(BagItem::getCount).collect(Collectors.toList());

    8,集合流操作 ,例如 找到玩家背包中道具数据大于5的前3个道具id

     Role role = new Role();
            List<String> result = role.getBag().getBagMap().values().
                    stream().filter(item -> item.getCount() > 5).map(BagItem::getItemId).
                    limit(3).collect(Collectors.toList());

    其中,filter是过滤,map是遍历所有项,并返回一个值,limit是取三个结果,collect是收集并返回。只有在collect时才执行计算代码。

    9,流的扁平化  flatmap

     它可以把几个相同类型的流合并成一个新的流。比如,获取List<String>集合中,各个字符串的字母集合,并去重。

     List<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("aaa");
            list.add("absc");
            list.add("bbb");
            
           List<String> selectResult = list.stream().map(v->v.split("")).flatMap(Arrays::stream).distinct().collect(Collectors.toList());
         

    输出结果

    [a, b, s, c]

    10,匹配判断

    List<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("aaa");
            list.add("absc");
            list.add("bbb");
            //是否所有的项都是以a开头
            boolean result = list.stream().allMatch(c->{
               return c.startsWith("a"); 
            });
            System.out.println(result);
            //是否有任何一项是否以a开头
            result = list.stream().anyMatch(c->{
               return c.startsWith("a"); 
            });
            //是否都不以a开头
            result = list.stream().noneMatch(c->{
               return c.startsWith("a"); 
            });

    这就是对应Java中的&& ,||

     

    11,list转map

    //转map
            List<Role> roles = new ArrayList<>();
            Map<String, Role> map = roles.stream().collect(Collectors.toMap(Role::getRid, role-> role));
            

     12,排序

    List<Student> studentList=Arrays.asList(new Student(1,"ziwen1",10),new Student(2,"aiwen2",18),new Student(3,"biwen3",28));
    
    List<Student> studentList1=studentList.stream().sorted().collect(Collectors.toList());//自然序列
    
    List<Student> studentList2=studentList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());//逆序
    
    List<Student> studentList3=studentList.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());//根据年龄自然顺序
    
    List<Student> studentList4=studentList.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList());//根据年龄逆序

     13,求最值

     PlayerHero hero1 = new PlayerHero();
            hero1.setHeroInfoId("1");
            hero1.setCombat(70);
            
            PlayerHero hero2 = new PlayerHero();
            hero2.setHeroInfoId("2");
            hero2.setCombat(20);
            PlayerHero hero3 = new PlayerHero();
            hero3.setHeroInfoId("3");
            hero3.setCombat(50);
            
            String id = Stream.of(hero2,hero3,hero1).max(Comparator.comparing(PlayerHero::getCombat)).get().getHeroInfoId();
            System.out.println(id);

     14 ,求和

    int totalCalories = menu.stream().collect(summingInt(Dish::getCalories));

    欢迎加群交流,QQ群:66728073,197321069,398808948 还可以扫描博客左上角二维码,关注游戏技术网公众号

  • 相关阅读:
    bae问题
    union intersect minus
    在搭建SpringMvc Hibernate框架时遇到的问题
    详细解读Spring2.5 +Struts1.3 框架(使用Spring声明式事物管理和springjjdbc模板)
    javaee缓存技术 oscache ehcache
    Warning
    Math
    Test
    网络流24题-最小路径覆盖问题
    Wannafly summer camp Day3--Knight
  • 原文地址:https://www.cnblogs.com/wgslucky/p/9973428.html
Copyright © 2020-2023  润新知