小编Nam*_*man的帖子

Java 8 - 将 <Map> 列表到单个映射中

我有一个List<Map<String, String>>。我想将其转换为单个地图。

列表大小可以是 1..n。不确定如何使用 Java 8 Stream 来做到这一点?

List<Map<String, String>> mapList = new ArrayList<>();

Map<String, String> map1 = new HashMap<>();
map1.put("1", "One");
map1.put("2", "Two");

Map<String, String> map2 = new HashMap<>();
map2.put("3", "Three");
map2.put("4", "Four");

mapList.add(map1);
mapList.add(map2);

Map<String, String> finalMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

我们可以在 Java 7 中做这样的事情:

for(Map<String, String> map : mapList) {            
    for(String key : map.keySet()) {                
        finalMap.put(key, map.get(key));
    }           
}

System.out.println("Final Map " + finalMap); // Final Map {1=One, 2=Two, 3=Three, 4=Four}
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

1
推荐指数
1
解决办法
3358
查看次数

有没有办法使用规范来模拟 LocalDateTime 时间戳

据推测,我正在为依赖specsScala. 测试更多地绑定到具有某些timestamp属性的事件流。

以下存根是实际实现的部分

private def eligibleForRecentPost(optionalPost: Option[SearchEntity]): Boolean = {
    optionalSearch.map(search => search.timestamp)
      .exists(searchTime => searchTime >= LocalDateTime.now()
        .minusDays(recencyDurationInDays).atZone(ZoneId.systemDefault).toInstant.toEpochMilli)
}
Run Code Online (Sandbox Code Playgroud)

现在,我要查找的代码可能类似于

// just a mock
when(LocalDateTime.now().minusDays(any)
    .atZone(ZoneId.systemDefault).toInstant.toEpochMilli)
    .thenReturn(1579625874972)
Run Code Online (Sandbox Code Playgroud)

请注意,我知道测试中的 search.timestamp 可以更新,但这需要在每次recencyDurationInDays!!

但是在specs2和/或scala中是否有更好更可靠的方法来做到这一点?

编辑:我必须提到,我不期待更改实现以致LocalDateTime被另一个类覆盖/包装。

scala mockito specs2 java-time localdatetime

1
推荐指数
1
解决办法
478
查看次数

Java11 引入的 Z 垃圾收集器有多稳定?

我正在使用Java 11新的 Z 垃圾收集器 (ZGC) 似乎很有前途。

文档说它使用了一些低延迟垃圾收集机制,这样GC暂停时间永远不会超过10 ms,非常好地处理大堆,并允许将未使用的堆内存返回给操作系统,而旧的 GC 不存在

我担心的是 - ZGC 的稳定性如何,如果在生产中继续推进,是否存在风险?

谢谢!

java garbage-collection java-11 zgc

1
推荐指数
1
解决办法
368
查看次数

aspectj-maven-plugin 1.11:jdk 11 缺少 tools.jar 问题

我的系统上安装了 pom 和 jdk 11 中的 aspectj-maven-plugin:1.11。Jdk 11 在 lib 目录中没有 tools.jar。这导致 maven 构建失败并出现错误:

[错误] 无法执行目标 org.codehaus.mojo:aspectj-maven-plugin:1.11:compile (default) on project groundtruth-storage-writer: 目标 org.codehaus.mojo 的执行默认:aspectj-maven-plugin:1.11 :compile failed: Plugin org.codehaus.mojo:aspectj-maven-plugin:1.11 或其依赖项之一无法解析:在指定路径找不到工件 com.sun:tools:jar:11.0.7 ...\ Java\jdk-11.0.7/../lib/tools.jar

如何解决这个问题?

有一个答案在这里,但超过2岁。

java aspectj maven-plugin java-11

1
推荐指数
1
解决办法
2310
查看次数

我无法从使用 Java JLink 工具创建的应用程序映像中读取外部文件

mvn javaf:jlink当应用程序运行时,我无法从我使用 JLink 工具 ( )创建的应用程序映像中读取外部文件。外部文件放置在资源文件夹中。这是我得到的错误:

ERROR ExecutorOfFiles Script failed to read or load: SampleScript.jsh
java.nio.file.NoSuchFileException: /com.luisosv/com/luisosv/SampleScript.jsh
        at java.base/jdk.internal.jrtfs.JrtFileSystem.checkNode(JrtFileSystem.java:494)
        at java.base/jdk.internal.jrtfs.JrtFileSystem.getFileContent(JrtFileSystem.java:253)
        at java.base/jdk.internal.jrtfs.JrtFileSystem.newByteChannel(JrtFileSystem.java:351)
        at java.base/jdk.internal.jrtfs.JrtPath.newByteChannel(JrtPath.java:696)
        at java.base/jdk.internal.jrtfs.JrtFileSystemProvider.newByteChannel(JrtFileSystemProvider.java:302)
        at java.base/java.nio.file.Files.newByteChannel(Files.java:370)
        at java.base/java.nio.file.Files.newByteChannel(Files.java:421)
        at java.base/java.nio.file.Files.readAllBytes(Files.java:3205)
        at com.luisosv@1.0-SNAPSHOT/com.luisosv.ExecutorOfFiles.loadSnippetsFromFile(ExecutorOfFiles.java:55)
Run Code Online (Sandbox Code Playgroud)

我正在使用以下内容来读取外部文件:

String sourceCode = new String(Files.readAllBytes(
                Paths.get(
                        this.getClass().getResource(scriptFileName).toURI())));
Run Code Online (Sandbox Code Playgroud)

但是,从命令行使用该应用程序可以正常工作mvn javafx:run

我读过应用程序映像一旦创建,就无法更新或修补。对于任何更改,都需要从https://www.studytrails.com/java/java-9/java-9-jlink/部署新的应用程序,我不知道这是原因还是其他原因。

提前致谢。

java resources javafx jlink java-11

1
推荐指数
1
解决办法
106
查看次数

Java Stream map(...) - 传递自定义函数时出错,尽管接受 methodReference

为了代码可读性,我正在创建自定义函数接口,同时将其作为映射器传递给map(...),编译错误即将到来。需要帮忙。下面的例子简化了这个问题。例如

@FunctionalInterface
public interface Try<K,T> {
    public K apply(T t);
}


public class Concrete{
    //example
    public static String checkFunc(Integer integer) {
        return "Vivek";
    }
}

public class CustomTest {

    public static void main(String[] args) {
        
        List<Integer> integers = Arrays.asList(1,2,3);
        
        Try<String,Integer> try1 = Concrete::checkFunc;
        
        integers.parallelStream().map(try1); // compile error
        //The method map(Function<? super Integer,? extends R>) in the type Stream<Integer> is not 
         //applicable for the arguments (Try<String,Integer>)

        integers.parallelStream().map(Concrete::checkFunc); // this is perfectly fine

    }
     
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试传递类似上面的映射器。如何正确地做到这一点?

java functional-programming java-stream

1
推荐指数
1
解决办法
32
查看次数

Java 16 Annotation ElementType.RECORD_COMPONENT 无法反映

使用 JDK 16,我声明了两个注释:

@Target({ ElementType.RECORD_COMPONENT})
@Retention(RetentionPolicy.RUNTIME)
public @interface A {}

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface B {}

Run Code Online (Sandbox Code Playgroud)

我声明了一个像这样的记录类?

public record User(@A @B long id, String name, int age) {}
Run Code Online (Sandbox Code Playgroud)

然后我使用反射来获取id的注解,即:

Annotation[] annotations = fields[0].getAnnotations();
Run Code Online (Sandbox Code Playgroud)

但是 的大小annotations是 1 而我只有@B,这是为什么呢?谢谢

java reflection java-record java-16

1
推荐指数
1
解决办法
108
查看次数

将一种枚举类型转换为另一种枚举类型的通用方法

我有两个枚举如下

第一的

public enum firstEnum {
    ALL_PRODUCT,
    SPECIFIC_COLLECTION,
    SPECIFIC_PRODUCT
}
Run Code Online (Sandbox Code Playgroud)

第二

public enum secondEnum {
    PRODUCT,
    COLLECTION,
    PRODUCT
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个通用方法来将一种类型转换为另一种类型,如下所示

public record EnumCasting() {
    public <E1,E2> E2 CastOneEnumToAnother(E1 enumFirst, E2 enumSecond) {
         return // some logic to convert
    }
}
Run Code Online (Sandbox Code Playgroud)

不知道我怎么能做到这一点,任何帮助将不胜感激。 firstEnum.ALL_Product should return secondEnum.Product, firstEnum.SPECIFIC_COLLECTION should return secondEnum.COLLECTION

java generics enums java-8

1
推荐指数
1
解决办法
205
查看次数

Java 记录 - 测试 - 修改字段

我有一个专门用于在运行时设置字段的测试框架。目的是设置测试用例。期待升级到 Java 14+ 记录,我注意到现有实用程序(例如ReflectionTestUtils.setFieldPropertyAccessorFactory.forDirectFieldAccess)适用于普通私有最终字段,但不适用于记录字段。

这是 JVM 的限制,还是这些实用程序的限制?

java testing reflection java-record

1
推荐指数
1
解决办法
1467
查看次数

捕获命令行参数并将其存储

我试图捕获命令行参数并将其存储为字符串,但是当我尝试将其转换为int时遇到编译器错误:

错误是:初始化使指针从整数变为无强制转换[默认启用] char test = argv [1];

#include <stdio.h>

int main(int argc, char** argv)
{

char test = argv[1];
printf("%c\n", test);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

c command-line-arguments

0
推荐指数
1
解决办法
2302
查看次数