返回一个字符串,其中包含所有交易者的姓名,在java8中按字母顺序排序,并带有空格



我只是在玩Java 8 streams并试图返回一串按字母顺序排序的所有交易者姓名。

public class PuttingIntoPractice {
    public static void main(String[] args) {
        Trader raoul = new Trader("Raoul", "Cambridge");
        Trader mario = new Trader("Mario","Milan");
        Trader alan = new Trader("Alan","Cambridge");
        Trader brian = new Trader("Brian","Cambridge");
        List<Transaction> transactions = Arrays.asList(
            new Transaction(brian, 2011, 300), 
            new Transaction(raoul, 2012, 1000),
            new Transaction(raoul, 2011, 400),
            new Transaction(mario, 2012, 710),  
            new Transaction(mario, 2012, 700),
            new Transaction(alan, 2012, 950)
        );
        // Query 4: Return a string of all traders’ names sorted alphabetically.
        String traderStr = transactions.stream()
                .map(t -> t.getTrader().getName())
                .sorted()
                .reduce("", (n1, n2) -> n1 + n2);
        System.out.println(traderStr);
    }
}

我得到的输出如下所示:

AlanBrianMarioMarioRaoulRaoul

我想像下面这样显示

 Alan Brian Mario Mario Raoul Raoul

我该怎么做?

我用龙目岛来生成所有这些样板的二传手吸气剂

@Setter @Getter
@ToString
@AllArgsConstructor
public class Trader {
    private String name;
    private String city;
}

交易

@Setter @Getter 
@ToString
@AllArgsConstructor
public class Transaction {
    private Trader trader;
    private int year;
    private int value;
}

代码中的问题是你如何减少Stream

正如目前所写,这个约简.reduce("", (n1, n2) -> n1 + n2);将简单地连接 2 个String,没有任何空格。要实现您想要的,您必须添加以将n1 + n2更改为 n1 + " " + n2 .但是,由于您希望将Stream的所有元素收集到单个String中,因此您应该使用Collectors。

因此,应将代码更改为:

String traderStr = transactions.stream()
                .map(t -> t.getTrader().getName())
                .sorted()
                .collect(Collectors.joining(" "));

最新更新