小编dav*_*hew的帖子

如何在可完成的 future 流中展平列表?

我有这个:

Stream<CompletableFuture<List<Item>>>
Run Code Online (Sandbox Code Playgroud)

我怎样才能将它转换为

Stream<CompletableFuture<Item>>
Run Code Online (Sandbox Code Playgroud)

其中:第二个流由第一个流中每个列表内的每个项目组成。

我研究了一下thenCompose,但这解决了一个完全不同的问题,也称为“扁平化”。

如何以流方式高效地完成此操作,而不阻塞或过早消耗不必要的流项目?

这是迄今为止我最好的尝试:

    ExecutorService pool = Executors.newFixedThreadPool(PARALLELISM);
    Stream<CompletableFuture<List<IncomingItem>>> reload = ... ;

    @SuppressWarnings("unchecked")
    CompletableFuture<List<IncomingItem>> allFutures[] = reload.toArray(CompletableFuture[]::new);
    CompletionService<List<IncomingItem>> queue = new ExecutorCompletionService<>(pool);
    for(CompletableFuture<List<IncomingItem>> item: allFutures) {
        queue.submit(item::get);
    }
    List<IncomingItem> THE_END = new ArrayList<IncomingItem>();
    CompletableFuture<List<IncomingItem>> ender = CompletableFuture.allOf(allFutures).thenApply(whatever -> {
        queue.submit(() -> THE_END);
        return THE_END;
    });
    queue.submit(() -> ender.get());
    Iterable<List<IncomingItem>> iter = () -> new Iterator<List<IncomingItem>>() {
        boolean checkNext = true;
        List<IncomingItem> next = null;
        @Override
        public boolean hasNext() {
            if(checkNext) {
                try { …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing concurrency java-stream completable-future

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

echo %JAVA_HOME% 在 cmd 中有效,但在 git bash 中无效

Windows 10 用户。我最近第一次安装了 git,但遇到了一个奇怪的问题。有人告诉我,JAVA_HOME如果我想在 git 中使用 java,我需要设置环境变量。

我能够JAVA_HOME正确更改命令提示符,但无法在 git bash 中显示相同的更改。输入echo %JAVA_HOME%会在命令提示符中返回正确的路径,但会%JAVA_HOME%在 git bash 中返回。

我进入系统设置并更改系统变量,使其JAVA_HOME指向我的 jdk。我更新了PATH系统变量和环境变量中的变量以指向bin和jdk。我关闭并重新打开 git bash 和命令提示符。我重新启动了机器,甚至重新安装了 git 和 jdk。我将 jdk 从 Java 10.0.2 降到了最新的 java 8 (171)。

这些都没有奏效。我已经浏览了无数的 SO 帖子。我究竟做错了什么?

java shell command-prompt java-home git-bash

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

在 Firefox 上获取 JSON 时,favicon.ico 被 CSP 阻止

我构建了一个简单的 Spring Boot Rest 控制器,它除了返回自定义 Java 对象 - 数据之外什么也不做。一切都编译并正常运行。当我从端点获取数据时,我得到了预期的数据。

\n

然而,当在 Firefox 上使用“ Inspect Element ”查看底层时,我看到由于内容安全策略 (CSP)导致的错误。内容安全策略错误如下:

\n

错误消息的屏幕截图

\n

“内容安全策略:页面\xe2\x80\x99s 设置阻止加载 http://localhost:8081/favicon.ico (\xe2\x80\x9cdefault-src\xe2\x80\x9d) 上的资源。”

\n

我尝试了几种解决方案,但均无济于事。

\n
    \n
  • 我尝试通过 application.properties 禁用该图标,但这似乎没有任何效果。
  • \n
  • 我创建了一个名为“favicon.ico”的图标并将其放置在正确的目录中。令人烦恼的是,这个页面仍然抛出错误,同时我的所有其他页面都开始获取图标。
  • \n
  • 我尝试了许多标头排列,包括将 Content-Security-Policy 标头设置为默认 src self。没有一个起作用,尽管这可能是问题的根源,因为似乎有很多我没有完全掌握的活动部件。
  • \n
  • 我尝试为“/favicon.ico”创建一个 GET 端点,但这似乎根本没有完成任何事情。\n
      \n
    • 此时我已将图标添加到我的目录中,因此当我尝试访问端点时,它只是向我发送了图标的图像,该图标也显示在浏览器顶部的选项卡中,并且没有错误在日志中。
    • \n
    \n
  • \n
  • 我试图摆弄 WebSecurityConfigurerAdapter,但这很快就失控了,坦率地说,其中很多都没有意义。
  • \n
\n

这是我的文件。

\n

应用程序属性 = application.properties

\n
spring.mvc.favicon.enabled=false\n\n
Run Code Online (Sandbox Code Playgroud)\n

主文件 - DemoApplication

\n
import org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class DemoApplication {\n\n   public static void main(String[] args) {\n …
Run Code Online (Sandbox Code Playgroud)

java firefox spring spring-mvc content-security-policy

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

为什么我的 lambda 获得非法前向引用,但我的匿名类却没有?

我正在尝试表示状态转换图,并且我想使用 Java 枚举来实现此目的。我很清楚,还有许多其他方法可以使用Map<K, V>或可能使用枚举中的静态初始化块来完成此操作。但是,我试图理解为什么会发生以下情况。

这是我正在尝试做的一个(极其)简化的示例。


enum RPS0
{
  
    ROCK(SCISSORS),
    PAPER(ROCK),
    SCISSORS(PAPER);
     
    public final RPS0 winsAgainst;
     
    RPS0(final RPS0 winsAgainst)
    {
        this.winsAgainst = winsAgainst;
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,由于非法的前向引用而失败。

ScratchPad.java:150: error: illegal forward reference
         ROCK(SCISSORS),
              ^
Run Code Online (Sandbox Code Playgroud)

没关系,我接受这一点。尝试手动插入SCISSORS需要Java尝试和设置SCISSORS,然后触发设置PAPER,然后触发设置ROCK,导致无限循环。那么我可以很容易地理解为什么这种直接引用是不可接受的,并且会因编译器错误而被禁止。

因此,我尝试对 lambda 进行同样的操作。

ScratchPad.java:150: error: illegal forward reference
         ROCK(SCISSORS),
              ^
Run Code Online (Sandbox Code Playgroud)

它失败了,并出现基本相同的错误。

ScratchPad.java:169: error: illegal forward reference
         ROCK(() -> SCISSORS),
                    ^
Run Code Online (Sandbox Code Playgroud)

我对此有点困扰,因为我真的觉得 lambda 应该让它不会失败。但不可否认的是,我对 lambda 表达式的规则、范围和边界了解不够,无法形成更坚定的观点。

顺便说一句,我尝试添加花括号并返回 lambda,但这也没有帮助。

所以,我尝试了一个匿名类。

enum RPS1
{
    ROCK(() -> SCISSORS),
    PAPER(() …
Run Code Online (Sandbox Code Playgroud)

java lambda enums anonymous-class circular-reference

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

Function::identity 在 Collectors.toMap 中不起作用

我试图将 a 转换List<String>为 a Map<T, String>,映射的值是前一个 中包含的元素List<String>,键是该元素的某个属性String(例如, 的长度String,在这种情况下,T实际上是 an Integer)。

我首先尝试这样做。这是我上面提到的示例的实现。我希望 的长度String成为键,而其String本身成为值。我想使用该Function::identity函数来明确指定该值是其String本身。

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class SOQ_ME_20220522_fail
{

   public static void main(String[] args)
   {
   
      final List<String> list = List.of("apple", "banana", "coconut");
      
      var result = 
         list.stream()
            .collect(
               Collectors.toMap(
                  each -> each.length(),
                  Function::identity
               )
            )
         ;

      System.out.println(result);
   
   }
   
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译它时,出现以下编译错误。

SOQ_ME_20220522_fail.java:15: error: no suitable method found for toMap((each)->ea[...]gth(),Function::identity) …
Run Code Online (Sandbox Code Playgroud)

java dictionary collect java-stream collectors

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

Scala 3 枚举方法覆盖

有没有办法像在 Java 中一样覆盖 Scala 3 枚举中的方法?

public enum Test {

    ONE {
        @Override
        public int calc() {
            return 1;
        }
    },
    TWO {
        @Override
        public int calc() {
            return 2;
        }
    };

    public abstract int calc();
}
Run Code Online (Sandbox Code Playgroud)

我试过这样的事情,但没有结果。在文档中也没有找到关于枚举方法覆盖的任何内容。

enum Test {
  def calc(): Int ={
    0
  }
  case One
    override def calc(): Int ={
      1
    }
  case Two
    override def calc(): Int ={
      2
    }
}
Run Code Online (Sandbox Code Playgroud)

也许有另一种方法可以实现类似的功能?

enums scala anonymous-class scala-3

3
推荐指数
2
解决办法
161
查看次数

为什么有 2 个类型名称相似的对象时会出现 ClassLoader 异常

我有一堂有两种方法的课程。

  • 在 中method1(),我创建了一个local record名为Abc. 这local record仅适用于method1()因为它是在(这里是根据 Java 的规则)中定义的。method1()

  • 在 中method2(),我创建了一个local interface名为ABC. 请注意,这里存在大小写差异。该local record被命名了Abc,但这个local interface被命名了ABC

这是班级。

//package ..... //commenting out package information, as I sincerely doubt that is the cause

/** There seems to be a class loader error when running the below method in main(). */
public class ClassLoaderIssue
{

   /** Method …
Run Code Online (Sandbox Code Playgroud)

java identifier uniqueidentifier classloader local-class

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

Pattern Matching for instanceof throwing a confusing error: expression type Triple is a subtype of pattern type Triple

I have Java 19, and I am attempting to do some simple pattern-matching on a record that I created. However, Java is giving me a very confusing compilation error. Here is the simplest example I could make that causes the error.

public class ExpressionTypeIsASubsetOfPatternType
{

   public record Triple(int a, int b, int c) {}

   public static void main(String[] args)
   {

      System.out.println("Java Version = " + System.getProperty("java.version"));

      final Triple input = new Triple(1, 2, 3);

      if (input instanceof Triple t)
      { …
Run Code Online (Sandbox Code Playgroud)

java instanceof pattern-matching java-record

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

什么是“this-escape”警告,我该如何处理它?

我很难找到这方面的资源,但是,当我在最新的 Java (21) 上编译代码时,我的很多类都遇到了这个错误。

这是一个代码示例。

public class ThisEscapeExample
{

        public Object o;

        public ThisEscapeExample()
        {

                this.overridableMethod();

        }

        public void overridableMethod()
        {

                this.o = new Object();

        }

}
Run Code Online (Sandbox Code Playgroud)

这是我的编译命令。

javac -Xlint:all ThisEscapeExample.java
ThisEscapeExample.java:9: warning: [this-escape] possible 'this' escape before subclass is fully initialized
                this.overridableMethod();
                                      ^
1 warning
Run Code Online (Sandbox Code Playgroud)

java warnings scope compiler-warnings this-pointer

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