将此标记用于特定于Java 11的问题,Java 11是Java平台的第11版,于2018年9月25日发布。在大多数情况下,您还应指定java标记。
我想知道是否有其他方法可以排除某些 JSON 的属性,而无需这些 JSON 的类。 我是这样设计的: // 启动排除 JSON 内部路径的方法 公开
公共类JavaRecursion { 静态无效 downloadStatus(int 百分比) { System.out.println("下载地址为 " + 百分比 + "% ”): 下载增加(); }
Appengine 运行时从 java 8 到 11 - 本地和部署运行中的问题
当我使用命令(“clean install package exec:java -Dexec.args=”target/appName-1.war”)在本地运行代码时,我收到以下错误消息>> Fil Not Found:哇...
将现有 Android 项目从 Java 8 迁移到 Java 11 时出现“错误:package android.view 不存在”错误
我正在开发多模块 Android 项目,目前该项目正在使用 Java 8,作为要求的一部分,我正在将此项目升级到 Java 11。下面是我迄今为止为实现目标所做的尝试...
我们将 Apache Ant 与 Nashorn JavaScript Engine 结合使用,该引擎在 jdk 15 及更高版本中已被弃用并删除。我试图找到如何从 Nashorn 切换到 Graal VM,但没有找到任何可用的信息...
如何使用 AwsCrtHttpClient(AWS CRT HTTP 客户端?)设置 POST 请求的请求正文
我正在使用 AWS CRT HTTP 客户端创建 HTTP 请求,但我找不到设置请求正文的方法。我将 Java 11 与 AWS SDK 版本 2.27.9 结合使用。不管我如何配置这个同步...
无法在 Windows 11 上将 JDK 添加到 PATH 环境变量
我尝试将 JDK 添加到 Windows 11 计算机上的 PATH 环境变量中,但遇到问题。当我尝试修改 PATH 时,我无法激活“编辑”按钮或...
是否有任何java接口或库可以将文件上传到共享点? 我必须从远程服务器下载文件并将下载的文件上传到共享点位置。
我正在尝试在我的 Mac Pro M1 上实施 SonarQube。 我已按照以下步骤操作:这里 我还安装了 JDK 11。 但出现错误: 运行 SonarQube... 包装| --> 包装器作为缺点开始...
我正在尝试在检查枚举的开关中测试默认情况。我看过一些帖子并找到了这个解决方案: int nValues = EnumType.values().length; 尝试 (MockedStatic 嘲笑 =
我仍在使用旧版本的 docx4j (2.8.1.10),这导致字体映射和哈希速度缓慢。 虽然我已经迁移到 jdk11,并且很快就会迁移到 jdk17。 还没有尝试过任何东西...
我在Linux(CentOS)上运行了这个命令: sudo yum 安装 libwebkitgtk-1.0-0 但后来我收到这条消息: 没有可用的软件包 libwebkitgtk-1.0-0。 错误:无事可做 有什么建议吗?尝试
我有两个代码片段 代码片段1 布尔标志= false; System.out.println((flag = true) | (flag = false) || (flag = true)); System.out.println(flag); 代码片段2 布尔状态 = true; S...
JOOQ 3.17.1 似乎正在生成无法与 Java 11 一起使用的源代码
升级到 jooq 3.17.1 后,出现以下错误: 错误: /home/runner/work/waste-coordinator/waste-coordinator/webapp/target/ generated-sources/jooq/com/myapp/portal/backend/jooq/tables/Loa...
如何改进此算法以获取 Java 8 或 11 中每个月的工作日数
我想知道如何改进这个非常简单的代码。 该代码非常冗长,并且两个 for 循环绝对不实用或简洁。 我正在考虑使用 Stream。
我最近从 Java 8 和 10.0.0.Final 升级到了 Java 11 和 Widfly 15.0.0.Final。但由于某种原因,测试脚本失败并出现以下异常。我已经升级了焊接并且...
使用 Java 流从带有 Set 值的 Map 中查找公共元素集
假设我有一个 HashMap,其中包含作为字符串的键和作为整数集的值(Map>)。 并假设地图填充有以下值: 地图 假设我有一个 HashMap,其中包含作为 String 的键和作为 Set (Integer) 的 Map<String, Set<Integer>> 的值。 并假设地图填充有以下值: Map<String, Set<Integer>> map = new HashMap<>(); map.put("w1", Set.of(1,3,4,6,7)); map.put("w2", Set.of(2,3,4,5,7)); map.put("w3", Set.of(1,2,3,5,7)); 如何使用 Java 中的 Streams 找到所有键的通用值集?例如:在这种情况下,所有键的公共值集是 Set.of(3,7)。 首先请注意,使用流并不总是最干净的方式。 我的想法是获取第一组并迭代其余组以检查它们是否全部包含它: Set<Integer> res = map.values().iterator().next().stream() .filter(item -> map.values().stream().allMatch(set -> set.contains(item))) .collect(Collectors.toSet()); 这是一个简洁的解决方案,但它会检查第一组两次。您还可以添加检查以查看地图是否包含任何条目。 我的方法是首先将不同的值分组并进行计数。然后只保留那些计数等于映射中条目数的条目。这是可行的,因为每个集合只能包含该值一次。 map.values().stream().flatMap(Set::stream) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream().filter(e -> e.getValue() == map.size()) .map(Map.Entry::getKey).collect(Collectors.toSet()); 这可以通过利用 collect() 操作来完成。 此方法背后的逻辑是从值集合中获取随机集,用一个新集包装它以避免突变,然后使用retainlAll()方法将所有集组合在一起一个。 即使值由不可变集表示(如问题中的示例),这也不是问题,因为它们将被完整保留。唯一会发生突变的集合是由collect()内的supplier函数提供的新集合。 如果地图空,可能会出现问题。 在这种情况下,任何从values集合中获取first set的尝试都会失败。因此,这种情况必须单独处理,如下面的方法getFirst()所示。 它可能看起来像: public static Set<Integer> getIntersectionStream(Map<String, Set<Integer>> map) { return map.values().stream() .collect(() -> getFirst(map), Set::retainAll, Set::addAll); } 相同的逻辑可以迭代实现: public static Set<Integer> getIntersectionLoop(Map<String, Set<Integer>> map) { Set<Integer> intersection = new HashSet<>(getFirst(map)); for (Set<Integer> next: map.values()) { intersection.retainAll(next); } return intersection; } 方法 get getFirst() 负责从 values 集合中检索 random set。在空映射的情况下,它将返回一个空的不可修改的集合,否则,它将产生流返回的第一个集合。 注意,在这种情况下,在可选项上调用 get() 是安全的,因为我们期望结果出现。 public static Set<Integer> getFirst(Map<String, Set<Integer>> map) { return map.isEmpty() ? Collections.emptySet() : new HashSet<>(map.values().stream().findFirst().get()); } 主要 public static void main(String[] args) { Map<String, Set<Integer>> map = Map.of("w1", Set.of(1,3,4,6,7), "w2", Set.of(2,3,4,5,7), "w3", Set.of(1,2,3,5,7)); System.out.println(getIntersectionStream(map)); System.out.println(getIntersectionLoop(map)); } 输出 [3, 7] [3, 7] Set<Integer> commonValues(Map<String, Set<Integer>> map) { if (map.isEmpty()) { return new HashSet<>(); } Set<Integer> intersection = new HashSet<>(map.values().iterator().next()); map.values().forEach(v -> intersection.retainAll(v)); return intersection; } 通用且可能有效的解决方案可能是: public static <T> Set<T> retain(Map<?, Set<T>> map) { Iterator<Set<T>> it = map.values().iterator(); if (!it.hasNext()) { return new HashSet<>(); } Set<T> result = new HashSet<>(it.next()); while (it.hasNext() && !result.isEmpty()) { result.retainAll(it.next()); } return result; } 注意 !result.isEmpty(),这是提前退出条件。 IE。如果结果为空,则这些集合没有共同元素。 注意:这是受到MikeFHay的answer的启发。 如果你确实想使用流,并且可以保证Set是可变的,那么你也可以使用reduce()终端操作: public static <T> Set<T> retain(Map<?, Set<T>> map) { return map.values().stream() .reduce((a, b) -> { a.retainAll(b); return a; }) .orElse(Set.of()); } 但请注意,这会修改并返回地图中的第一个集合。 这个简单的版本使用带有集合操作的流来通过查找其中一个成员来填充 intersections,并 retainAll 来匹配所有其他成员: Set<Integer> intersection = new HashSet<>(); map.values().stream().limit(1).forEach(intersection::addAll); map.values().stream().forEach(intersection::retainAll); 我首先建议不要使用流,只需如下所示简单地执行即可。这确实删除了地图的一个元素。 你可以只做 map.get("w1") 并做一个多余的 retainAll。 请注意,由于您使用 Map.of 创建了一个不可变集,我必须制作一个副本以允许修改 result。 Set<Integer> result = new HashSet<>(map.remove("w1")); for (Set<Integer> set : map.values()) { result.retainAll(set); } 这是一个流解决方案。 为了避免使用初始化程序进行归约操作,我将使用 reducing Collector。该收集器返回一个 Optional,因此必须使用 orElse 来检索集合并允许空地图。 Set<Integer> result = map.values().stream() .collect(Collectors.reducing((a, b) -> { a.retainAll(b); return a; }))..orElse(new HashSet<>()); System.out.println(result); 以上都会打印 [3, 7] 显示的解决方案假定已正确填充 Map。 完整的解决方案将包括检查 在我看来,这是最好的解决方案: map.values().stream().reduce((s1, s2) -> { Set<Integer> s3 = new HashSet<>(s2); s3.retainAll(s1); return s3; }).orElse(new HashSet<>()); 它是通过集合相交而减少的地图值流。 这可以使用Stream.reduce来解决: Set<Integer> commonElements = map.values().stream() .reduce((s1, s2) -> s1.stream() .filter(s2::contains) .collect(Collectors.toUnmodifiableSet())) .orElseThrow(NoSuchElementException::new); 归约的每一步都会创建一个新的Set,其中仅包含两个集合之间的共同元素。 我在这里没有做的一个简单的优化(为了简单起见)是有条件地交换 s1 和 s2 ,以便较小的集合被流式传输,因为这是基于大小的线性时间发生的套装中的。
在 Java 中使用流从值为集合的 Map 中查找公共元素集
假设我有一个 HashMap,其中包含作为字符串的键和作为整数集的值(Map)。 并假设地图填充有以下值: 地图 假设我有一个 HashMap,其中包含作为字符串的键和作为整数集的值(Map)。 并假设地图填充有以下值: Map<String, Set<Integer>> map = new HashMap<>(); map.put("w1", Set.of(1,3,4,6,7)); map.put("w2", Set.of(2,3,4,5,7)); map.put("w3", Set.of(1,2,3,5,7)); 如何使用 Java 中的 Streams 找到所有键的通用值集?例如:在这种情况下,所有键的公共值集是 Set.of(3,7) 首先请注意,使用流并不总是最干净的方式。 我的想法是获取第一组并迭代其余组以检查它们是否全部包含它: Set<Integer> res = map.values().iterator().next().stream() .filter(item -> map.values().stream().allMatch(set -> set.contains(item))) .collect(Collectors.toSet()); 这是一个简洁的解决方案,但它会检查第一组两次。您还可以添加检查以查看地图是否包含任何条目。 Set<Integer> commonValues(Map<String, Set<Integer>> map) { if (map.isEmpty()) { return new HashSet<>(); } Set<Integer> intersection = new HashSet<>(map.values().iterator().next()); map.values().forEach(v -> intersection.retainAll(v)); return intersection; } 我的方法是首先将不同的值分组并进行计数。然后只保留那些计数等于映射中条目数的条目。这是可行的,因为每个集合只能包含该值一次。 map.values().stream().flatMap(Set::stream) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream().filter(e -> e.getValue() == map.size()) .map(Map.Entry::getKey).collect(Collectors.toSet()); 这可以通过利用 collect() 操作来完成。 此方法背后的逻辑是从值集合中获取随机集,用一个新集包装它以避免突变,然后使用retainlAll()方法将所有集组合在一起一个。 即使值由不可变集表示(如问题中的示例),这也不是问题,因为它们将被完整保留。唯一会发生突变的集合是由collect()内的supplier函数提供的新集合。 如果地图空,可能会出现问题。 在这种情况下,任何从values集合中获取first set的尝试都会失败。因此,这种情况必须单独处理,如下面的方法getFirst()所示。 它可能看起来像: public static Set<Integer> getIntersectionStream(Map<String, Set<Integer>> map) { return map.values().stream() .collect(() -> getFirst(map), Set::retainAll, Set::addAll); } 相同的逻辑可以迭代实现: public static Set<Integer> getIntersectionLoop(Map<String, Set<Integer>> map) { Set<Integer> intersection = new HashSet<>(getFirst(map)); for (Set<Integer> next: map.values()) { intersection.retainAll(next); } return intersection; } 方法 get getFirst() 负责从 values 集合中检索 random set。在空映射的情况下,它将返回一个空的不可修改的集合,否则,它将产生流返回的第一个集合。 注意,在这种情况下,在可选项上调用 get() 是安全的,因为我们期望结果出现。 public static Set<Integer> getFirst(Map<String, Set<Integer>> map) { return map.isEmpty() ? Collections.emptySet() : new HashSet<>(map.values().stream().findFirst().get()); } 主要 public static void main(String[] args) { Map<String, Set<Integer>> map = Map.of("w1", Set.of(1,3,4,6,7), "w2", Set.of(2,3,4,5,7), "w3", Set.of(1,2,3,5,7)); System.out.println(getIntersectionStream(map)); System.out.println(getIntersectionLoop(map)); } 输出 [3, 7] [3, 7] 通用且可能有效的解决方案可能是: public static <T> Set<T> retain(Map<?, Set<T>> map) { Iterator<Set<T>> it = map.values().iterator(); if (!it.hasNext()) { return new HashSet<>(); } Set<T> result = new HashSet<>(it.next()); while (it.hasNext() && !result.isEmpty()) { result.retainAll(it.next()); } return result; } 注意 !result.isEmpty(),这是提前退出条件。 IE。如果结果为空,则这些集合没有共同元素。 注意:这是受到MikeFHay的answer的启发。 如果你确实想使用流,并且可以保证Set是可变的,那么你也可以使用reduce()终端操作: public static <T> Set<T> retain(Map<?, Set<T>> map) { return map.values().stream() .reduce((a, b) -> { a.retainAll(b); return a; }) .orElse(Set.of()); } 但请注意,这会修改并返回地图中的第一个集合。 这个简单的版本使用带有集合操作的流来通过查找其中一个成员来填充 intersections,并 retainAll 来匹配所有其他成员: Set<Integer> intersection = new HashSet<>(); map.values().stream().limit(1).forEach(intersection::addAll); map.values().stream().forEach(intersection::retainAll); 我首先建议不要使用流,只需如下所示简单地执行即可。这确实删除了地图的一个元素。 你可以只做 map.get("w1") 并做一个多余的 retainAll。 请注意,由于您使用 Map.of 创建了一个不可变集,我必须制作一个副本以允许修改 result。 Set<Integer> result = new HashSet<>(map.remove("w1")); for (Set<Integer> set : map.values()) { result.retainAll(set); } 这是一个流解决方案。 为了避免使用初始化程序进行归约操作,我将使用 reducing Collector。该收集器返回一个 Optional,因此必须使用 orElse 来检索集合并允许空地图。 Set<Integer> result = map.values().stream() .collect(Collectors.reducing((a, b) -> { a.retainAll(b); return a; }))..orElse(new HashSet<>()); System.out.println(result); 以上都会打印 [3, 7] 显示的解决方案假定已正确填充 Map。 完整的解决方案将包括检查 在我看来,这是最好的解决方案: map.values().stream().reduce((s1, s2) -> { Set<Integer> s3 = new HashSet<>(s2); s3.retainAll(s1); return s3; }).orElse(new HashSet<>()); 它是通过集合相交而减少的地图值流。 这可以使用Stream.reduce来解决: Set<Integer> commonElements = map.values().stream() .reduce((s1, s2) -> s1.stream() .filter(s2::contains) .collect(Collectors.toUnmodifiableSet())) .orElseThrow(NoSuchElementException::new); 归约的每一步都会创建一个新的Set,其中仅包含两个集合之间的共同元素。 我在这里没有做的一个简单的优化(为了简单起见)是有条件地交换 s1 和 s2 ,以便较小的集合被流式传输,因为这是基于大小的线性时间发生的套装中的。
假设我们有一个 3 维对象列表。 类自定义{ 整数ID; 列表列表; Custom(id, list) { /* 构造函数 */ } // Getter 和 Setter } 类自定义容器{ ...
我试图理解为什么当我在下面的代码片段中从 y.addAll(x) 更改为 x.addAll(y) 时会出现不同: List 结果 = List.of(1, 2) .parallelStream() .收集...