[JAVA] 람다식 기본 예제 2 (sorted)

JDK 라이브러리의 코드에서 정렬, 리버싱은 많이 사용된다.
정렬을 위해 리스트에 대해 sort() 메서드를 사용한다. 이 메서드는 void메서드 이기 때문에 원본 리스트를 보존하기 위해서 복사본을 만들어 두어야 하고 원본이 아닌 복사복에 대해서 sort() 메서드는 호출해야한다.
이젠 stream 의 sorted()를 사용하면 번거러운 작업을 피할 수 있다.

예제소스1은 하나의 값으로 정렬.
예제소스2는 복수의 값을 비교하여 정렬

예제소스1

public class Person {

	  private final String name;
	  private final int age;

	  public Person(final String theName, final int theAge) {
	    name = theName;
	    age = theAge;
	  } 

	  public String getName() { return name; }
	  public int getAge() { return age; }

	  public String toString() {
	    return String.format("%s - %d", name, age);
	  }

} 


final List<Person> people = Arrays.asList( new Person("Zohn", 25), new Person("Sara", 21), new Person("Jane", 21), new Person("Greg", 35)); //java7 sort 사용 Collections.sort(people, new Comparator<Person>() { public int compare(Person o1, Person o2) { return o1.getName().compareTo(o2.getName()); } }); Collections.sort(people, new Comparator<Person>() { public int compare(Person o1, Person o2) { return o1.getName().compareTo(o2.getName()); } }); System.out.println("sort 이름순 정렬 "+people); //java8 sorted 사용 List<Person> people1= people.stream() .sorted(Comparator.comparing((Person person) -> person.getAge())).collect(Collectors.toList()); System.out.println("sorted 나이순 정렬 "+people1); List<Person> people2= people.stream() .sorted(Comparator.comparing((Person person) -> person.getName())).collect(Collectors.toList()); System.out.println("sotred 이름순 정렬 "+people2); }


출력

sort 이름순 정렬 [Greg - 35, Jane - 21, Sara - 21, Zohn - 25]

sorted 나이순 정렬 [Jane - 21, Sara - 21, Zohn - 25, Greg - 35]

sotred 이름순 정렬 [Greg - 35, Jane - 21, Sara - 21, Zohn - 25]


예제소스2
정렬 조건 : 우선노출여부가 Y인게 1순위, 영역코드 2순위, 노출순위 3순위로 정렬.
복수의 조건으로 정렬할때는 .thenComparing 을 사용한다.

public class Person {

	    public Person(String prioYn, String expsFdC, String prioOr)
	    {
	        this.prioYn = prioYn;				// 우선노출여부
	        this.expsFdC = expsFdC;				// 영역코드
	        this.prioOr = prioOr;				// 노출순위
	    }

	    /**
	     * The name of the person.
	     */
	    public String prioYn;
	    public String expsFdC;
	    public String prioOr;
		public String getPrioYn() {
			return prioYn;
		}
		public void setPrioYn(String prioYn) {
			this.prioYn = prioYn;
		}
		public String getExpsFdC() {
			return expsFdC;
		}
		public void setExpsFdC(String expsFdC) {
			this.expsFdC = expsFdC;
		}
		public String getPrioOr() {
			return prioOr;
		}
		public void setPrioOr(String prioOr) {
			this.prioOr = prioOr;
		}
		@Override
		public String toString() {
			return "Person [prioYn=" + prioYn + ", expsFdC=" + expsFdC + ", prioOr=" + prioOr + "]";
		}
	    
	}


	    List<Person> peopleList = new ArrayList<>();
	    peopleList.add(new Person("Y", "B", "1"));
	    peopleList.add(new Person("N", "B", "0"));
	    peopleList.add(new Person("Y", "B", "3"));
	    peopleList.add(new Person("Y", "B", "2"));
	    peopleList.add(new Person("", "A", ""));	    
	    peopleList.add(new Person("", "A", ""));
	    
	    for(Person personVO : peopleList) {
	    	System.out.println(personVO.toString());
	    }
	    System.out.println("---------------------------------------------------------");
	    
	    List<Person> peopleSortedList = new ArrayList<>();
	    peopleSortedList = peopleList.stream().map(p -> {        // expsFdC(영역코드)가 A인것은 우선노출여부가 없으므로 N으로 set
	    	Person obj = p;
	    	if("A".equals(obj.getExpsFdC())){
	    		obj.setPrioYn("N");
	    	}
	    	return obj;
	    }).sorted(Comparator.comparing(Person::getPrioYn).reversed()
				.thenComparing(Comparator.comparing(Person::getExpsFdC))
				.thenComparing(Comparator.comparing(Person::getPrioOr)))
	    		.collect(Collectors.toList());
	    
	    System.out.println("peopleSortedList");
	    for(Person personVO : peopleSortedList) {
	    	System.out.println(personVO.toString());
	    }
	}

출력

Person [prioYn=Y, expsFdC=B, prioOr=1]

Person [prioYn=N, expsFdC=B, prioOr=0]

Person [prioYn=Y, expsFdC=B, prioOr=3]

Person [prioYn=Y, expsFdC=B, prioOr=2]

Person [prioYn=, expsFdC=A, prioOr=]

Person [prioYn=, expsFdC=A, prioOr=]

---------------------------------------------------------

peopleSortedList

Person [prioYn=Y, expsFdC=B, prioOr=1]

Person [prioYn=Y, expsFdC=B, prioOr=2]

Person [prioYn=Y, expsFdC=B, prioOr=3]

Person [prioYn=N, expsFdC=A, prioOr=]

Person [prioYn=N, expsFdC=A, prioOr=]

Person [prioYn=N, expsFdC=B, prioOr=0]