
import java.util.*;
import java.util.stream.*;
class Solution {
    public long solution(long n) {
        
        StringBuilder strBuilder = new StringBuilder();
        
        Arrays.stream(String.valueOf(n).split(""))
        .map(a -> Long.parseLong(a))
        .sorted(Comparator.reverseOrder())
        .collect(Collectors.toList())
        .forEach(a -> strBuilder.append(a));
        
        return Long.parseLong(strBuilder.toString());
        
    }
}
split()에 의해 만들어진 list를 stream으로 처리하기 위해 Arrays.stream()Comparator.reverseOrder()를 사용해 내림차순 정렬(역정렬)toList()를 사용하려 했으나 자바 버전때문에 불가(Java 16 이상) -> collect(Collector.toList())로 List로 전환 (Java 8 이상)StringBuilder를 사용해서 문자열 생성Stream API에서 최종 연산(terminal operation)을 수행하는 메서드. 스트림의 결과를 컬렉션(리스트, 맵 등)이나 다른 형태로 변환하는 역할을 한다.
<R, A> R collect(Collector<? super T, A, R> collector);
public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "orange");
        // 스트림을 Map으로 수집 (문자열 길이를 키로 사용)
        Map<Integer, String> result 
        	= list.stream()
        		.collect(Collectors.toMap(String::length, s -> s));
        System.out.println(result);  // {5=apple, 6=banana, 6=orange}
    }
}
String::length : 메서드 참조(String 클래스의 length() 메서드를 직접 참조)import java.util.*;
public class Main {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(5, 2, 8, 1, 3);
        list.sort(Comparator.reverseOrder());
        System.out.println(list);
    }
}
append(String str): 문자열을 StringBuilder의 끝에 추가insert(int offset, String str): 지정된 위치(offset)에 문자열을 삽입delete(int start, int end): start부터 end까지의 문자를 삭제deleteCharAt(int index): 지정된 인덱스의 문자를 삭제replace(int start, int end, String str): start부터 end까지의 문자를 str로 대체length()capacity() : 현재 StringBuilder의 용량을 반환trimToSize(): StringBuilder의 용량을 현재 문자열의 길이에 맞게 줄임reverse()indexOf(String str): 문자열에서 str이 처음 등장하는 인덱스를 반환lastIndexOf(String str): 문자열에서 str이 마지막으로 등장하는 인덱스를 반환substring(int start): start 인덱스부터 끝까지의 부분 문자열을 반환substring(int start, int end): start부터 end까지의 부분 문자열을 반환toString(): StringBuilder 객체를 String 객체로 변환setCharAt(int index, char ch): 지정된 인덱스의 문자를 ch로 변경getChars(int srcBegin, int srcEnd, char[ ] dst, int dstBegin): StringBuilder의 문자열을 char 배열로 복사import java.util.*;
class Solution {
  public long solution(long n) {
        String[] list = String.valueOf(n).split("");
        Arrays.sort(list);
        StringBuilder sb = new StringBuilder();
        for (String aList : list) sb.append(aList);
        return Long.parseLong(sb.reverse().toString());
  }
}
StringBuilder로 reverse()를 사용하여 String으로 만들었다.
그 덕분에 코드가 전체적으로 깔끔하고 가독성이 좋다.
이번에 StringBuilder에 대해 학습했으니 collect의 대체로 사용해봐도 좋을 것 같다.
public class ReverseInt {
    String res = "";
    public int reverseInt(int n){
        res = "";
        Integer.toString(n).chars().sorted().forEach(c -> res = Character.valueOf((char)c) + res);
        return Integer.parseInt(res);
    }
    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void  main(String[] args){
        ReverseInt ri = new ReverseInt();
        System.out.println(ri.reverseInt(118372));
    }
}
chars(): 문자열을 IntStream으로 변환forEach(c -> res = Character.valueOf((char)c) + res)res에 문자를 앞에 추가하지만 이 코드는 지금은 작동이 안될 것이다.
왜냐하면 stream에는 final 변수만 들어갈 수 있고, 이것을 변경하려고하면 컴파일 에러가 발생할 것이다.
이 코드를 수정한다면 res 가 StringBuilder 의 객체가 된다면 사용 할 수 있다.