Java 8 当我使用Java 8 lambda对来自流的一系列项使用limit()时,如何获得超出的限制?

Java 8 当我使用Java 8 lambda对来自流的一系列项使用limit()时,如何获得超出的限制?,java-8,Java 8,如果不使用另一个条件来比较map.size和limitValue,我如何知道当我的流迭代时限制已超过? 在这里 对于limitValue=3,它应该返回false。 对于limitValue=4,它应该返回true。 我不能使用外部int字段,因为它必须是final才能在lambda内部使用 import java.util.*; import java.util.stream.*; public class Test { public static void main(String[

如果不使用另一个条件来比较map.size和limitValue,我如何知道当我的流迭代时限制已超过? 在这里 对于limitValue=3,它应该返回false。 对于limitValue=4,它应该返回true。 我不能使用外部int字段,因为它必须是final才能在lambda内部使用

import java.util.*;
import java.util.stream.*;
public class Test {

    public static void main(String[] args) throws Exception {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "foo");
        map.put(2, "bar");
        map.put(3, "baz");
        int limitValue = 3;

        String result = map.entrySet()
            .stream()
            .limit(limitValue)
            .map(entry -> entry.getKey() + " - " + entry.getValue())
            .collect(Collectors.joining(", "));
        System.out.println(result);
    }
}
我不能使用外部int字段,因为它必须是最终字段才能使用 在兰姆达里面

import java.util.*;
import java.util.stream.*;
public class Test {

    public static void main(String[] args) throws Exception {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "foo");
        map.put(2, "bar");
        map.put(3, "baz");
        int limitValue = 3;

        String result = map.entrySet()
            .stream()
            .limit(limitValue)
            .map(entry -> entry.getKey() + " - " + entry.getValue())
            .collect(Collectors.joining(", "));
        System.out.println(result);
    }
}
是的,这是因为,在lambda表达式中,只能引用java中值不变的局部变量

这在某种程度上是一件好事,因为在并行执行时,在lambda中变异变量不是线程安全的

因此,系统通过只允许在lambdas中使用final或有效的final变量,帮助您在编译时防止出现这种情况

注意,此限制仅适用于局部变量

无论如何,我的建议是不要对不完全包含在给定函数本身中的变量进行变异,因为它会引入副作用,而流操作的行为参数中的副作用通常是不鼓励的

保持简单,并按照以下方法进行操作

 boolean exceeded = limitValue > map.size();

使用另一个条件来比较map.size和limitValue有什么问题?您想解决什么具体问题?boolean Extered=limitValue>map.size有什么问题?我是说,你为什么不能用这个?