【问题标题】:Get key-values from java object using stream collectors使用流收集器从 java 对象中获取键值
【发布时间】:2017-08-13 22:38:30
【问题描述】:

我正在尝试使用流和收集器从对象列表中获取键和值列表,但我不知道这是否可能。

我有这门课:

public class MyObject {

    private int key1;

    private String key2;

    private String key3;

    public int getKey1() { return key1; }

    public void setKey1(int key1) { this.key1 = key1; }

    public String getKey2() { return key2; }

    public void setKey2(String key2) { this.key2 = key2; }

    public String getKey3() { return key3; }

    public void setKey3(String key3) { this.key3 = key3; }
}

我想处理这个对象的列表并获取所有值和所有键,用逗号分隔。

List<MyObject> objectList = myObjectList;
String keys = objectList.stream().collect(Collectors.joining(", ","(", ")"));
String values = Collections.nCopies(objectList.size(), "?").stream().collect(Collectors.joining(", ", " (", ")"));

有人知道这是否可能吗?还是我应该尝试其他选择?

【问题讨论】:

  • 我在MyObject 类中看不到任何值
  • 你的意思是 List objectList 吗?
  • 值存储在哪里?它们是在类中定义的吗?
  • 值来自方法中的一个条目,我想获取它们以便插入数据库
  • 我已经描述了一种键的方法。请查看答案,并询问是否有不清楚的地方。如果您提供值所在的上下文以及您期望的结果,我将编辑答案。

标签: java java-8 java-stream collectors


【解决方案1】:

对于Stream&lt;MyObject&gt; 的每个元素,您可以通过Stream#flatMapStream.of 创建其键** 的Stream&lt;String&gt;*:

String keys = objectList
        .stream()
        .flatMap(o -> Stream.of(o.getKey1(), o.getKey2(), o.getKey3()).map(Object::toString))
        .collect(Collectors.joining(",", "(", ")"));

*由于某些字段(键)不是String 类型,所以Stream&lt;Object&gt; 可以通过Stream#map(Object::toString) 转换为Stream&lt;String&gt;

**如果你有 getter 的话,值也是一样的。


进一步,我将为该类定义一个List 提取器 (Function&lt;MyObject, String&gt;)(可以有一个静态方法来返回此列表):

public static List<Function<MyObject, String>> getExtractors() {
    return Arrays.asList(
            o -> String.valueOf(o.getKey1()),
            MyObject::getKey2,
            MyObject::getKey3
    );
}

.flatMap(o -> getExtractors().stream().map(extractor -> extractor.apply(o)))

【讨论】:

  • 或者你可以将key 1转换成String,直接得到Stream&lt;String&gt;flatMap(o -&gt; Stream.of(String.valueOf(o.getKey1()), o.getKey2(), o.getKey3()))
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 2020-09-02
  • 2022-06-16
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多