programing

스트림을 사용하여 객체 목록을 toString 메서드에서 얻은 문자열로 변환

prostudy 2022. 6. 7. 21:30
반응형

스트림을 사용하여 객체 목록을 toString 메서드에서 얻은 문자열로 변환

Java 8에는 많은 유용한 새로운 것들이 있습니다. 예를 들어, 나는 오브젝트 목록 위에 스트림으로 반복할 수 있습니다. 그리고 나서 특정 필드의 값을 합칠 수 있습니다.Object의 인스턴스입니다.예.

public class AClass {
  private int value;
  public int getValue() { return value; }
}

Integer sum = list.stream().mapToInt(AClass::getValue).sum();

그래서 제가 묻고 있는 것은 이 빌딩을 건설할 수 있는 방법이 있나요?String그 결과물을 연결한다.toString()한 줄에 있는 인스턴스에서 메서드를 사용합니다.

List<Integer> list = ...

String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class

라고 가정해 보자list정수 포함1,2그리고.3라고 생각합니다.concatenated"123"또는"1,2,3".

한 가지 간단한 방법은 목록 항목을 에 추가하는 것입니다.StringBuilder

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

StringBuilder b = new StringBuilder();
list.forEach(b::append);

System.out.println(b);

다음과 같은 방법도 있습니다.

String s = list.stream().map(e -> e.toString()).reduce("", String::concat);

설명: 맵은 Integer 스트림을 String 스트림으로 변환한 후 모든 요소의 연결로 축소합니다.

주의: 이것은normal reductionO(n2)로 동작합니다.

퍼포먼스를 향상시키려면StringBuilder또는mutable reductionF와 비슷합니다.뵐러의 대답.

String s = list.stream().map(Object::toString).collect(Collectors.joining(","));

참조: 스트림 감소

수집가가 있다.joiningAPI에서 확인할 수 있습니다.에서는 정적인 방법입니다.Collectors.

list.stream().map(Object::toString).collect(Collectors.joining(","))

이 필요하기 때문에 완벽하지 않다.toString동작합니다.다른 딜리미터를 사용할 수 있습니다.

만약 누군가가 Java 8을 사용하지 않고 이것을 하려고 한다면, 꽤 좋은 방법이 있다.List.toString()은 이미 다음과 같은 컬렉션을 반환합니다.

[1,2,3]

특정 요건에 따라 목록 항목에 [] 또는 [ ]가 포함되지 않는 한 원하는 대로 후처리할 수 있습니다.

예:

list.toString().replace("[","").replace("]","") 

또는 데이터에 대괄호가 포함되어 있는 경우:

String s=list.toString();
s = s.substring(1,s.length()-1) 

상당히 합리적인 결과를 얻을 수 있습니다.

각 행에 다음과 같이 1개의 어레이 항목을 작성할 수 있습니다.

list.toString().replace("[","").replace("]","").replaceAll(",","\r\n")

이 기술을 사용하여 작은 앱의 목록에서 html 툴팁을 만들었습니다.

list.toString().replace("[","<html>").replace("]","</html>").replaceAll(",","<br>")

어레이가 있는 경우 Arrays.asList(리스트)부터 시작합니다.대신 toString()을 사용합니다.

이것이 최적이라고는 할 수 없지만, 생각만큼 비효율적이지 않고, 읽고 이해하는 것도 간단합니다.단, 이 방법은 매우 유연하지 않습니다.특히 데이터에 쉼표가 포함되어 있는 경우 replaceAll로 요소를 구분하지 마십시오.데이터에 대괄호가 있는 경우 서브스트링 버전을 사용합니다.단, 숫자 배열에 대해서는 거의 완벽합니다.

String API에는 이러한 "문자열 목록 결합" 사용 사례에 대한 메서드가 있습니다. Stream은 필요하지 않습니다.

List<String> myStringIterable = Arrays.asList("baguette", "bonjour");

String myReducedString = String.join(",", myStringIterable);

// And here you obtain "baguette,bonjour" in your myReducedString variable

다른 답변은 괜찮습니다.단, Collectors.toList()를 파라미터로 Stream.collect()전달하여 요소를 ArrayList로 반환할 수도 있습니다.

System.out.println( list.stream().map( e -> e.toString() ).collect( toList() ) );

StringListName = ObjectListName.stream().map().collectors.toList();

List<String> list = Arrays.asList("One", "Two", "Three");
    list.stream()
            .reduce("", org.apache.commons.lang3.StringUtils::join);

또는

List<String> list = Arrays.asList("One", "Two", "Three");
        list.stream()
                .reduce("", (s1,s2)->s1+s2);

이 접근법에서는 오브젝트 목록에서 문자열 결과를 작성할 수도 있습니다.예:

List<Wrapper> list = Arrays.asList(w1, w2, w2);
        list.stream()
                .map(w->w.getStringValue)
                .reduce("", org.apache.commons.lang3.StringUtils::join);

여기서는 reduce 함수를 사용하여 새로운 문자열을 추가할 초기값을 지정할 수 있습니다.예:

 List<String> errors = Arrays.asList("er1", "er2", "er3");
            list.stream()
                    .reduce("Found next errors:", (s1,s2)->s1+s2);

Shail016bpedroso의 답변에 제시된 두 가지 접근법 테스트(https://stackoverflow.com/a/24883180/2832140),의 심플한 방법StringBuilder+append(String)의 범위 내에서for, loop loop loop loop loop loop loop보다 훨씬 빠르게 실행되는 것 .list.stream().map([...].

: :는 「」를 합니다.Map<Long, List<Long>>문자열을 .json은 json을 사용합니다.list.stream().map([...]:

if (mapSize > 0) {
    StringBuilder sb = new StringBuilder("[");

    for (Map.Entry<Long, List<Long>> entry : threadsMap.entrySet()) {

        sb.append("{\"" + entry.getKey().toString() + "\":[");
        sb.append(entry.getValue().stream().map(Object::toString).collect(Collectors.joining(",")));
    }
    sb.delete(sb.length()-2, sb.length());
    sb.append("]");
    System.out.println(sb.toString());
}

개발 VM에서 junit은 보통 0.35초에서 1.2초 사이에 테스트를 실행합니다.단, 다음 코드를 사용하면 0.15 ~0.33초 걸립니다.

if (mapSize > 0) {
    StringBuilder sb = new StringBuilder("[");

    for (Map.Entry<Long, List<Long>> entry : threadsMap.entrySet()) {

        sb.append("{\"" + entry.getKey().toString() + "\":[");

        for (Long tid : entry.getValue()) {
            sb.append(tid.toString() + ", ");
        }
        sb.delete(sb.length()-2, sb.length());
        sb.append("]}, ");
    }
    sb.delete(sb.length()-2, sb.length());
    sb.append("]");
    System.out.println(sb.toString());
}
String actual = list.stream().reduce((t, u) -> t + "," + u).get();

streams api를 사용하여 정수 스트림을 단일 문자열로 변환합니다.제공된 답변 중 일부에 대한 문제는 문자열 구축에 의해 O(n^2) 실행 시간이 생성된다는 것입니다.보다 나은 해결책은 String Builder를 사용한 후 마지막 단계로 문자열을 결합하는 것입니다.

//              Create a stream of integers 
    String result = Arrays.stream(new int[]{1,2,3,4,5,6 })                
            // collect into a single StringBuilder
            .collect(StringBuilder::new, // supplier function
                    // accumulator - converts cur integer into a string and appends it to the string builder
                    (builder, cur) -> builder.append(Integer.toString(cur)),
                    // combiner - combines two string builders if running in parallel
                    StringBuilder::append) 
            // convert StringBuilder into a single string
            .toString();

오브젝트 컬렉션을 단일 문자열로 변환하여 이 프로세스를 한 단계 더 진행할 수 있습니다.

// Start with a class definition
public static class AClass {
    private int value;
    public int getValue() { return value; }
    public AClass(int value) { this.value = value; }

    @Override
    public String toString() {
        return Integer.toString(value);
    }
}

// Create a stream of AClass objects
        String resultTwo = Arrays.stream(new AClass[]{
                new AClass(1),
                new AClass(2),
                new AClass(3),
                new AClass(4)
        })
                // transform stream of objects into a single string
                .collect(StringBuilder::new,
                        (builder, curObj) -> builder.append(curObj.toString()),
                        StringBuilder::append
                )
            // finally transform string builder into a single string
            .toString();

이거 먹어봐도 돼요?

public static void main(String []args){
        List<String> stringList = new ArrayList<>();
        for(int i=0;i< 10;i++){
            stringList.add(""+i);
        }
        String stringConcated = String.join(",", stringList);
        System.out.println(stringConcated);

    }

그리고 이렇게 해도 돼요.

    List<String> list = Arrays.asList("One", "Two", "Three");
    String result = String.join(", ", list);
    System.out.println(result);

Java 8+ 사용 시

String s = Arrays.toString(list.stream().toArray(AClass[]::new));

가장 효율적이지는 않지만 적은 양의 코드를 가진 솔루션입니다.

언급URL : https://stackoverflow.com/questions/24882927/using-streams-to-convert-a-list-of-objects-into-a-string-obtained-from-the-tostr

반응형