[java8] list에서stream 흐름 조작

46927 단어 java8

[java8] 작업 중 자주 사용하는stream 작업의 메모 기록

  • List 정렬
  • List-to-Map
  • List-to-Map
  • List-MultiMap
  • 두 개의 서로 다른 대상의List가 교차하는 맵
  • List to key id,value 대상
  • List Pack Properties Partner로 분할
  • 일상적인 개발 작업 중의 많은 업무 장면은 데이터베이스에서 찾아낸 각종 데이터를 대응하는vo에 포맷해야 한다. 이런 업무를 편리하고 신속하게 완성하기 위해 업무류의list 사용 흐름에 대해 각종 조작을 해야 한다.이전 작업에서 현재 생각할 수 있는liststream 흐름 조작을 기록할 준비를 하세요.

    List 정렬


    List에서 객체의 필드 순서 또는 역순 정렬
    public static void sortTest() {
            List<ClassEntity> classes = Lists.newArrayList();
            classes.add(new ClassEntity().setNames("bb").setIds(22).setUserId(2));
            classes.add(new ClassEntity().setNames("aa").setIds(11).setUserId(1));
            classes.add(new ClassEntity().setNames("dd").setIds(44).setUserId(4));
            classes.add(new ClassEntity().setNames("cc").setIds(33).setUserId(3));
            //   
            classes.sort(Comparator.comparing(ClassEntity::getUserId));
            log.info(" :{}", classes);
            //  
            classes.sort(Comparator.comparing(ClassEntity::getUserId).reversed());
            log.info(" :{}", classes);
    }
    

    실행 결과
     :[StreamTest.ClassEntity(userId=1, ids=11, names=aa), StreamTest.ClassEntity(userId=2, ids=22, names=bb), StreamTest.ClassEntity(userId=3, ids=33, names=cc), StreamTest.ClassEntity(userId=4, ids=44, names=dd)]
    
     :[StreamTest.ClassEntity(userId=4, ids=44, names=dd), StreamTest.ClassEntity(userId=3, ids=33, names=cc), StreamTest.ClassEntity(userId=2, ids=22, names=bb), StreamTest.ClassEntity(userId=1, ids=11, names=aa)]
    

    List to Map


    List에서 HashMap과 guava의 MultiMap으로 전환

    List to Map


    정상적으로 사용하다
    public static void listToMapTest() {
            List<ClassEntity> classes = Lists.newArrayList();
            classes.add(new ClassEntity().setNames("aa").setIds(11).setUserId(1));
            classes.add(new ClassEntity().setNames("bb").setIds(22).setUserId(2));
            classes.add(new ClassEntity().setNames("cc").setIds(33).setUserId(3));
    
            Map<Integer, String> map = classes.stream()
                    .collect(Collectors.toMap(ClassEntity::getUserId, ClassEntity::getNames);
    
            map.forEach((k, v) -> {
                System.out.println(
                        "k:" + k + ",v:" + v
                );
            });
        }
    

    실행 결과
    k:1,v:aa
    k:2,v:bb
    k:3,v:cc
    

    위의 정상적인 사용법은 정상적인 상황에서 정상적으로 실행할 수 있지만 데이터의 키가 중복되는 경우도 있다.예를 들면 이렇게.
    classes.add(new ClassEntity().setNames("aa").setIds(11).setUserId(1));
    classes.add(new ClassEntity().setNames("bb").setIds(22).setUserId(2));
    classes.add(new ClassEntity().setNames("cc").setIds(33).setUserId(3));
    classes.add(new ClassEntity().setNames("dd").setIds(33).setUserId(3));
    

    이 때 다음과 같은 이상을 보고합니다
    Exception in thread "main" java.lang.IllegalStateException: Duplicate key cc
    

    실행할 때 이런 상황에 부딪히지 않도록 이상을 던지기 위해서 이렇게 할 수 있어요.
    Map<Integer, String> map = classes.stream().collect(Collectors.toMap(ClassEntity::getUserId, ClassEntity::getNames, (key1, key2) -> key2));
    

    Collectors.Map에 이 줄(key1, key2)->key2)이 추가되었습니다. 이때 키가 중복되는 경우value값은 기본적으로 마지막으로 찾은value값으로 바뀌고 결과는 됩니다.
    k:1,v:aa
    k:2,v:bb
    k:3,v:dd
    

    List 회전 MultiMap


    멀티맵은 guava에서 구현되는value가 List 유형인 맵으로, 위에서 List가 Map을 돌릴 때 키가 중복되는 상황이 발생하면 이런 방법으로 멀티맵으로 전환하는 것을 고려할 수 있다.
    public static void listToMultiMap() {
            List<ClassEntity> classes = Lists.newArrayList();
            classes.add(new ClassEntity().setNames("aa").setIds(11).setUserId(1));
            classes.add(new ClassEntity().setNames("ff").setIds(44).setUserId(1));
            classes.add(new ClassEntity().setNames("bb").setIds(22).setUserId(2));
            classes.add(new ClassEntity().setNames("cc").setIds(33).setUserId(3));
    
            ImmutableListMultimap<Integer, ClassEntity> orderItemMap = Multimaps.index(classes, new Function<ClassEntity, Integer>() {
                @Override
                public Integer apply(ClassEntity classEntity) {
                    return classEntity.getUserId();
                }
            });
            log.info("multiMap:{}", orderItemMap);
        }
    

    실행 결과는 다음과 같습니다.
    {
    	1 = [StreamTest.ClassEntity(userId = 1, ids = 11, names = aa), StreamTest.ClassEntity(userId = 1, ids = 44, names = ff)],
    	2 = [StreamTest.ClassEntity(userId = 2, ids = 22, names = bb)],
    	3 = [StreamTest.ClassEntity(userId = 3, ids = 33, names = cc)]
    }
    

    서로 다른 두 객체의 List가 교차하는 맵을 가져옵니다.

    public static void listToMap() {
            List<User> users = Lists.newArrayList();
            users.add(new User().setName("a").setId(1));
            users.add(new User().setName("b").setId(2));
            users.add(new User().setName("c").setId(3));
    
            List<ClassEntity> classes = Lists.newArrayList();
            classes.add(new ClassEntity().setNames("aa").setIds(11).setUserId(1));
            classes.add(new ClassEntity().setNames("bb").setIds(22).setUserId(2));
            classes.add(new ClassEntity().setNames("cc").setIds(33).setUserId(3));
    
            Map<Integer, String> map = users.stream().collect(
                    Collectors.toMap(user -> user.getId(), user -> classes.get(users.indexOf(user)).getNames())
            );
            map.forEach((key, value) -> {
                System.out.println(key + ":" + value);
            });
        }
    

    실행 결과는 다음과 같습니다.
    1:aa
    2:bb
    3:cc
    

    List 키를 id로 전환하고value 를 대상으로 함

    public static void listToMapTest2() {
            List<ClassEntity> classes = Lists.newArrayList();
            classes.add(new ClassEntity().setNames("aa").setIds(11).setUserId(1));
            classes.add(new ClassEntity().setNames("bb").setIds(22).setUserId(2));
            classes.add(new ClassEntity().setNames("cc").setIds(33).setUserId(3));
    
            Map<Integer, ClassEntity> idAndBeadMap = classes.stream().collect(Collectors.toMap(ClassEntity::getIds, java.util.function.Function.identity()));
            idAndBeadMap.forEach((k, v) -> {
                log.info("key :{},value :{}", k, v);
            });
        }
    

    실행 결과는 다음과 같습니다.
    key :33,value :ClassEntity(userId=3, ids=33, names=cc)
    key :22,value :ClassEntity(userId=2, ids=22, names=bb)
    key :11,value :ClassEntity(userId=1, ids=11, names=aa)
    

    List 등록 정보를 문자로 분할

    public static void joiningTest() {
           List<ClassEntity> classes = Lists.newArrayList();
           classes.add(new ClassEntity().setNames("bb").setIds(22).setUserId(2));
           classes.add(new ClassEntity().setNames("aa").setIds(11).setUserId(1));
           classes.add(new ClassEntity().setNames("cc").setIds(33).setUserId(3));
    
           String a = classes.stream().map(c -> String.valueOf(c.getUserId())).collect(Collectors.joining(","));
           log.info(" String :{}", a);
       }
    

    실행 결과는 다음과 같습니다.
     String :2,1,3
    

    좋은 웹페이지 즐겨찾기