Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8303939

about use "list.stream().distinct().map()" bug

XMLWordPrintable

      ADDITIONAL SYSTEM INFORMATION :
      win10 / centos7.9

      A DESCRIPTION OF THE PROBLEM :
      use "list.stream().distinct().map()" ,
      when I change the element value in "map()",the "distinct()" lapsed.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Look at the Test code comment "TODO here !!" ----> ssc.setChangeFlag(1);
      If I comment out the code, return 5 element.
      else if I use the code, return size 4 element.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      I should get 4 element of the new list theoretically.
      ACTUAL -
      But it return 5.

      ---------- BEGIN SOURCE ----------
      public class Test55 {
          public static void main(String[] args) {
              List<SnStateChanged> snStateChangedList = new ArrayList<>();
              SnStateChanged ssc1 = SnStateChanged.builder().sn("1a").snChannel("1c").snVersion("1v").snYear("1y").count(1).build();
              SnStateChanged ssc2 = SnStateChanged.builder().sn("2a").snChannel("2c").snVersion("2v").snYear("2y").count(2).build();
              SnStateChanged ssc3 = SnStateChanged.builder().sn("3a").snChannel("3c").snVersion("3v").snYear("3y").count(3).build();
              SnStateChanged ssc4 = SnStateChanged.builder().sn("1a").snChannel("1c").snVersion("1v").snYear("1y").count(1).build();
              SnStateChanged ssc5 = SnStateChanged.builder().sn("1a").snChannel("1c").snVersion("1vv").snYear("1yy").count(1).build();
              snStateChangedList.add(ssc1);
              snStateChangedList.add(ssc2);
              snStateChangedList.add(ssc3);
              snStateChangedList.add(ssc4);
              snStateChangedList.add(ssc5);

              /** distinct + map */
              List<SnStateChanged> list = snStateChangedList.stream().distinct().map(ssc -> {
                  // TODO here !!
                  ssc.setChangeFlag(1);
                  System.out.println(ssc);
                  return ssc;
              }).collect(Collectors.toList());

              System.out.println(">>>>end>>>>");
          }
      }

      @Data
      @Builder
      @NoArgsConstructor
      @AllArgsConstructor
      public class SnStateChanged {
          
          private Long id;

          private String sn;

          private Integer state;

          private Timestamp changeTime;

          private Integer count;

          private Integer activated;

          private Integer unbinding;

          private String snChannel;

          private String snVersion;

          private String snYear;

          private int changeFlag;

      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      split to double stream list, use ".collect(Collectors.toList())".
      distinct list & map list.

      FREQUENCY : always


            tongwan Andrew Wang
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: