Java 将流中的两个对象映射到单个第三个对象?

Java 将流中的两个对象映射到单个第三个对象?,java,collections,java-stream,Java,Collections,Java Stream,如果我有一个时间戳列表和一个要转换的对象的文件路径,我可以创建一个转换器集合,期望使用方法签名ConverterfilePath、start、end吗 更详细的Pseuo代码: 一些有时间戳的列表想象它们在几秒钟内路径=某处,列表={0,15,15,30} 我怎样才能做这样的事情: list.stream.magic.mapstart,end->新建转换器路径,start,end 结果:新转换器路径0,15,新转换器路径15,30 注意:我知道双功能,但据我所知,streams并没有实现它。有许

如果我有一个时间戳列表和一个要转换的对象的文件路径,我可以创建一个转换器集合,期望使用方法签名ConverterfilePath、start、end吗

更详细的Pseuo代码:

一些有时间戳的列表想象它们在几秒钟内路径=某处,列表={0,15,15,30}

我怎样才能做这样的事情: list.stream.magic.mapstart,end->新建转换器路径,start,end

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


注意:我知道双功能,但据我所知,streams并没有实现它。

有许多方法可以使用streams获得所需的结果

但首先,您不必使用流API,在处理包含数十个和数百个元素的列表时,我建议使用普通的旧列表迭代

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

我们很容易看到两个表面问题,这两个问题源于流的性质及其与元素配对的不相容性:

有必要应用有状态函数,这对于在map中使用非常棘手,应该被认为是肮脏的编码;映射在偶数处产生一些空值,这些空值应该被适当地过滤掉; 当流包含奇数个元素时就会出现问题,并且您永远无法预测它是否包含奇数个元素。 如果您决定使用streams,那么为了明确起见,我们需要一个迭代器、拆分器或收集器的自定义实现,具体取决于需求。 无论如何,有两个不明显的例子,你不愿意自己去实现,所以你可以尝试大量的第三方流库。 最受欢迎的两种是和。 他们肯定有配对流元素的工具。。。但别忘了检查您案例的性能

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

请通过一个例子说明,在开始和结束的地方你需要什么?你是说列表中的所有奇数元素都应该绑定到起始arg,所有偶数元素都应该绑定到结束arg;还是别的?@diziaq媒体转换器通常需要开始和结束时间,比如给我25秒到30秒的所有视频。25是开始时间,30是结束时间。我在问题中给出的列表中没有看到25值。因此,请将您希望从该列表中获得的开始、结束对添加到后枚举中。您的意思是在列表中一次获取两个元素?那条河是什么类型的?这听起来根本不像是一个有效的流应用程序。不允许包含奇数个时间戳的集合,并且在调用子例程时通过抛出IllegalArgumentException(详细说明原因)。Hmm,我不知道在使用流和迭代器进行操作之间存在明显的性能损失。这不是一个高性能的项目,所以我很好。顺便说一句,我不知道其他流库,谢谢你让我看到了它们!