用lambda表达式java实现计数变量

用lambda表达式java实现计数变量,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我有一个关于lambda表达式的问题。我有一个类对,它应该包含一个字符串和一个int Pair从文件中获取字符串。 int表示行号。 到目前为止,我有: Stream<String> lineNumbers = Files.lines(Paths.get(fileName)); List<Integer> posStream = Stream.iterate(0, x -> x + 1).limit(lineNumbers.count()).collect

我有一个关于lambda表达式的问题。我有一个类对,它应该包含一个字符串和一个int

Pair从文件中获取字符串。 int表示行号。 到目前为止,我有:

 Stream<String> lineNumbers = Files.lines(Paths.get(fileName));
    List<Integer> posStream = Stream.iterate(0, x -> x + 1).limit(lineNumbers.count()).collect(Collectors.toList());
    lineNumbers.close();
    Stream<String> line = Files.lines(Paths.get(fileName));
    List<Pair> pairs = line.map((f) -> new Pair<>(f,1))
            .collect(Collectors.toList());
    pairs.forEach(f -> System.out.println(f.toString()));
    line.close();
streamlinenumbers=Files.line(path.get(fileName));
List posStream=Stream.iterate(0,x->x+1).limit(lineNumbers.count()).collect(Collectors.toList());
linenumber.close();
streamline=Files.lines(path.get(fileName));
列表对=line.map((f)->新对(f,1))
.collect(Collectors.toList());
forEach(f->System.out.println(f.toString());
line.close();
我现在如何将文件编号输入到配对中? 是否有lambda表达式可以执行此操作?或者我还需要别的什么

int cnt=1;
int cnt = 1;
List<Pair> pairs = line.map((f) -> new Pair<>(f,cnt++))
                       .collect(Collectors.toList());
列表对=line.map((f)->新对(f,cnt++) .collect(Collectors.toList());

我还没有尝试过,但可能会奏效。

另一种功能方法是使用整数生成器压缩流列表

(我可以看到java8还没有,但它实际上是将两个列表中的每个单元格合并成一对列表,因此很容易实现)


您可以在java8中看到generator的示例,有几种方法可以做到这一点。所建议的计数器技术可以如下实现,使用
原子整数
作为可变计数器对象,并假设明显的
类:

List<Pair> getPairs1() throws IOException {
    AtomicInteger counter = new AtomicInteger(0);
    try (Stream<String> lines = Files.lines(Paths.get(FILENAME))) {
        return lines.parallel()
                    .map(line -> new Pair(line, counter.incrementAndGet()))
                    .collect(toList());
    }
}

这是行不通的,因为lambda表达式需要一个final来执行它,所以我不能在lambda表达式中增加一个值,然后我想你不能使用lambda执行他想要的。无论如何,lambda不应该以可变的方式使用。这是我家庭作业中关于lambda表达式和流的一个小方法。你可以构建一个计数器对象,每次获取都增加值,声明它为final,并在lambda中使用它。根据定义,lambda是幂等的,这意味着如果您使用相同的参数多次调用它,它每次都将返回相同的结果。这就是为什么我说在lambda中增加一个值是反函数的。映射(arr->新整数(i.getAndIncrement())。。。。
static List<Pair> getPairs2() throws IOException {
    List<String> lines = Files.readAllLines(Paths.get(FILENAME));
    return IntStream.range(0, lines.size())
                    .parallel()
                    .mapToObj(i -> new Pair(lines.get(i), i+1))
                    .collect(toList());
}