java - 使用流收集器从 java 对象获取键值

标签 java java-8 java-stream collectors

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

我有这门课:

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(", ", " (", ")"));

有谁知道可以吗?或者我应该尝试其他选择?

最佳答案

对于 Stream<MyObject> 的每个元素,您可以创建 Stream<String> *其按键**由Stream#flatMapStream.of :

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

*因为某些字段(键)不是 String类型,a Stream<Object>可以变成Stream<String>通过Stream#map(Object::toString) .

**如果您有值的 getter,则同样可以使用值。

<小时/>

更进一步,我将定义 List类的提取器( Function<MyObject, String> )(可以有一个静态方法来返回此列表):

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)))

关于java - 使用流收集器从 java 对象获取键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45661170/

相关文章:

java - 基于 2 个对象对列表中的元素进行分组,如果它们具有相同的值,则仅显示该元素一次,并显示计数

java - Stream<Set<Object>> 而不是 Stream<Object>

java - Android 入门项目结构

java - TabLayout 中的选项卡没有填满整个 ActionBar

java - Google Maps v2 Projection.toScreenLocation(...) 极慢

java - 是否有提供更多功能的 JToolBar 替代品?

java - 在 Java 1.8.0_152 中使用 Math.round(double d) 时转换为 int

java - java 8中是否存在并发时发生的liveness failure

java - LongAccumulator 没有得到正确的结果

过滤器的java流列表