Как реализовать сложение списка в Java - PullRequest
22 голосов
/ 04 июня 2009

У меня есть список, и я хочу уменьшить его до одного значения (термин функционального программирования «сложить», термин Ruby inject), например

Arrays.asList("a", "b", "c") ... fold ... "a,b,c"

Поскольку я заражен идеями функционального программирования (Scala), я ищу более простой / короткий способ его кодирования, чем

sb = new StringBuilder
for ... {
  append ...
}
sb.toString

Ответы [ 14 ]

1 голос
/ 30 июля 2015

Теперь вы можете использовать String.join() с Java 8.

    List strings = Arrays.asList("a", "b", "c");
    String joined = String.join(",", strings);
    System.out.println(joined);
1 голос
/ 04 июня 2009

К сожалению, Java не является функциональным языком программирования и не имеет хорошего способа сделать то, что вы хотите.

Я полагаю, что в библиотеке Apache Commons есть функция с именем join , которая будет делать то, что вы хотите.

Это должно быть достаточно хорошо, чтобы скрыть цикл в методе.

public static String combine(List<String> list, String separator){
    StringBuilder ret = new StringBuilder();
    for(int i = 0; i < list.size(); i++){
        ret.append(list.get(i));
        if(i != list.size() - 1)
            ret.append(separator);
    }
    return ret.toString();
}

Полагаю, вы могли бы сделать это рекурсивно:

public static String combine(List<String> list, String separator){
    return recursiveCombine("", list, 0, separator);
}

public static String recursiveCombine(String firstPart, List<String> list, int posInList, String separator){
    if (posInList == list.size() - 1) return firstPart + list.get(posInList);

    return recursiveCombine(firstPart + list.get(posInList) + separator, list, posInList + 1, seperator);
}
0 голосов
/ 22 февраля 2018

Стиль Java 8 (функциональный):

// Given
List<String> arr = Arrays.asList("a", "b", "c");
String first = arr.get(0);

arr = arr.subList(1, arr.size());
String folded = arr.stream()
            .reduce(first, (a, b) -> a + "," + b);

System.out.println(folded); //a,b,c
0 голосов
/ 07 сентября 2010

Такой функции нет, но вы можете создать что-то вроде следующего и вызывать ее всякий раз, когда вам это нужно.

import java.util.Arrays;
import java.util.List;

public class FoldTest {
    public static void main( String [] args ) {
        List<String> list = Arrays.asList("a","b","c");
        String s = fold( list, ",");
        System.out.println( s );
    }
    private static String fold( List<String> l, String with  ) {
        StringBuilder sb = new StringBuilder();
        for( String s: l ) {
            sb.append( s ); 
            sb.append( with );
        }
        return sb.deleteCharAt(sb.length() -1 ).toString();

    }
}
...