Helpex - Trao đổi & giúp đỡ Đăng nhập
30

Tôi đang học lambda ngay bây giờ và tôi tự hỏi làm thế nào tôi có thể viết mã này bằng một dòng duy nhất với lambda.

Tôi có một Personlớp bao gồm một IDnamecác trường

Hiện tại, tôi có một List<Person>kho lưu trữ những Personđồ vật này . Những gì tôi muốn đạt được là lấy một chuỗi bao gồm id của một người giống như.

"id1, id2, id3" .

Làm thế nào tôi có thể thực hiện điều này với lambda?

30 hữu ích 0 bình luận 15k xem chia sẻ
39

Để lấy một Stringbao gồm tất cả các ID phân cách bằng dấu phân cách ","trước hết bạn phải mapPersonID thành một dòng mới mà sau đó bạn có thể áp dụng Collectors.joiningvào.

String result = personList.stream().map(Person::getId)
                          .collect(Collectors.joining(","));

nếu trường ID của bạn không Stringphải là một inthoặc một số kiểu số nguyên thủy khác thì bạn nên sử dụng giải pháp bên dưới:

String result = personList.stream().map(p -> String.valueOf(p.getId()))
                          .collect(Collectors.joining(","));
39 hữu ích 1 bình luận chia sẻ
3

phát trực tiếp đến bản đồ, và thu thập vào danh sách!

List<String> myListofPersons = personList.stream()
          .map(Person::getId)
          .collect(Collectors.toList());

nếu bạn cần điều đó trong một đối tượng Chuỗi thì hãy tham gia danh sách

String res = String.join(" , ", myListStringId);
System.out.println(res);
3 hữu ích 1 bình luận chia sẻ
1

Hơi được thiết kế kỹ lưỡng, nhưng sẽ hữu ích nếu sự cố này xảy ra thường xuyên hơn (đặc biệt nếu bạn thêm các phương thức được nạp chồng ủy quyền cho phương thức này bằng cách sử dụng trình liên kết và dấu phân tách mặc định):

/**
 * @param separator used to join the values. NOTE: the separator is interpreted as a regular expression.
 * @return a list of the values' string representation according to <code>mapper</code>, separated by the specified
 *         string. Null if list is null or empty.
 */
public static <R> String toListString(Collection<R> list, String separator,
                                      Function<? super R, ? extends String> mapper)
{
    if (list == null || list.isEmpty())
    {
        return null;
    }

    return list.stream()
               .map(mapper)
               .collect(Collectors.joining(separator));
}

và nghịch đảo thích hợp:

/**
 * @param list a list of values, separated by the specified separator
 * @param separator used to join the values. NOTE: the separator is interpreted as a regular expression.
 * @param mapper the function to map a single string to a value.
 * @return a list of the values. Empty if string is null or empty.
 */
public static <R> List<R> fromListString(String list, String separator,
                                         Function<? super String, ? extends R> mapper)
{
    if (list == null || list.isEmpty())
    {
        return new ArrayList<>();
    }

    return Arrays.stream(list.trim().split(separator))
                 .map(mapper)
                 .collect(Collectors.toCollection(ArrayList::new));
}

Nếu hiệu suất là một vấn đề, tôi sẽ chọn phương pháp tiếp cận vòng lặp cổ điển:

    StringBuilder s = new StringBuilder();
    for(R r : list){
        if (s.length() != 0)
            s.append(separator);
        s.append(mapper.apply(r));
    }
    return s.toString();

và:

    List<R> result = new ArrayList<>();
    for (String s : list.trim().split(separator)){
        result.add(mapper.apply(s));
    }
    return result;
1 hữu ích 0 bình luận chia sẻ
1

Bạn cũng có thể sử dụng ánh xạ Collectors # như bên dưới:

String ids = personList.stream().collect(mapping(Person::getId
      , Collectors.joining(",")));

HOẶC Person.ID không phải là một trường hợp của CharSequencekhi đó bạn cần ánh xạ kép như sau:

String ids = personList.stream().collect(mapping(Person::getId
    , mapping(String::valueOf
        , Collectors.joining(","))));
1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java lambda java-8 java-stream , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading