gpt4 book ai didi

java - 将流中的 2 个对象映射到单个第三个对象?

转载 作者:行者123 更新时间:2023-12-02 11:13:55 25 4
gpt4 key购买 nike

如果我有要转换的对象的时间戳列表和文件路径,我可以创建一个需要方法签名的转换器集合Converter(filePath, start, end)

更多详细信息(伪代码):

一些带有时间戳的列表(想象一下它们以秒为单位)path = Something, list = {0, 15, 15, 30},

我怎样才能做这样的事情:list.stream.magic.map(start, end -> new Converter (path, start, end))?

结果:新转换器(路径,0, 15),新转换器(路径,15, 30)

注意:我知道 BiFunction,但据我所知,流并未实现它。

最佳答案

有很多方法可以使用流来获取所需的结果。

但首先,您没有义务使用 Stream API,如果要处理包含数十个和数百个元素的列表,我建议使用普通旧列表迭代。

例如,尝试下面的代码示例。

我们很容易看出流的本质所产生的两个表面问题以及它们与配对其元素的想法的不相容性:

  • 有必要应用有状态函数,这在 map() 中使用确实很棘手,应该被视为脏编码;并且映射会在偶数位置产生一些空值,应正确过滤掉这些空值;
  • 当流包含奇数个元素时就会出现问题,并且您永远无法预测它是否会出现。

如果您决定使用流,那么为了明确我们需要迭代器、 split 器或收集器的自定义实现 - 取决于需求。无论如何,有一些不明显的极端情况您不会乐意自己实现,因此可以尝试大量的第三方流库。其中最受欢迎的两个是 StreamexRxJava 。他们肯定有用于配对流元素的工具...但不要忘记检查您的案例的性能!

import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Stream;

public class Sample
{
public static void main(String... arg)
{
String path = "somewhere";

Stream<Converter> stream = Stream.of(0, 15, 25, 30).map(
new Function<Integer, Converter>()
{
int previous;
boolean even = true;

@Override
public Converter apply(Integer current)
{
Converter converter = even ? null : new Converter(path, previous, current);

even = !even;

previous = current;

return converter;
}
}).filter(Objects::nonNull);

stream.forEach(System.out::println);
}

static class Converter
{
private final String path;
private final int start;
private final int end;

Converter(String path, int start, int end)
{

this.path = path;
this.start = start;
this.end = end;
}

public String toString()
{
return String.format("Converter[%s,%s,%s]", path, start, end);
}
}
}

关于java - 将流中的 2 个对象映射到单个第三个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com