【问题标题】:Joining a collection based on members of the type根据类型的成员加入集合
【发布时间】:2015-06-16 18:29:18
【问题描述】:

我有一个 A 类及其成员 b 和 c。 现在我用这个构造List<A>

add(new A().setb("abcd").setc("123456"));
add(new A().setb("efgh").setc("789101"));
add(new A().setb("ijkl").setc("112345"));

我想将此列表转换为如下所示的字符串

abcd,123456
efgh,789101
ijkl,112345

现在最明显的方法是使用StringBuilder 并遍历列表。现在我想使用Guava Joiner 来建立这个

Joiner.on("\n").skipNulls().join(.......)

join() 方法需要一个可迭代对象。我可以通过A.getb(),A.getc() 以某种方式传递Iterables.transform 帮助吗?

【问题讨论】:

  • 您可以先将每个A 转换为String,方法是将其成员加入,。将这些结果收集到List。然后将该列表中的String 值与\n 连接起来。

标签: java functional-programming guava method-chaining


【解决方案1】:

使用 Java 8,您可以使用

String result = as.stream().map((a) -> a.b + ',' + a.c).collect(Collectors.joining("\n"));

它首先从List 中的每个A 元素生成String,然后通过用换行符连接各个String 值将其收集到String

使用番石榴,你会得到类似的东西

String result = Joiner.on('\n').join(Iterables.transform(as, (a) -> a.b + ',' + a.c));

假设as 是你的List<A>

【讨论】:

  • 谢谢。但是我不知道 Guava 支持 -> 运算符
  • @AbhiroopSarkar Guava 只是一个库。它是用 Java 编写的。从 Java 8 开始,语法包含 lambda 表达式。您可以将它与任何代码一起使用。
  • 哦!我以为你是在 Java 6 中编写 Guava 表达式。因为我自己正在使用 Java 6。忘记提了。但是,我认为在 Java 8 中使用 Guava 的功能结构没有什么意义,前提是该语言现在本身支持 lambda 表达式。但是,您能否在我目前的回答中告诉我,与 StringBuilder 的简单方法相比,它的计算量是否更大或更少或相同?我认为 Iterables 会进行惰性评估。
  • @AbhiroopSarkar 在如此高的级别上,它将是等效的。除非您每秒进行数百万次这种计算,否则您不会发现任何差异。
【解决方案2】:

解决了!!

假设List<A> 被称为Alist

String join=Joiner.on("\n").skipNulls().join(Iterables.transform(Alist, new Function<A,String>(){
            public String apply(A input){
                return input.getb()+","+input.getc();
            }
        }));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多