我有这个:
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
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 帖子。我究竟做错了什么?
我构建了一个简单的 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
\nspring.mvc.favicon.enabled=false\n\n
Run Code Online (Sandbox Code Playgroud)\n主文件 - DemoApplication
\nimport 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 枚举来实现此目的。我很清楚,还有许多其他方法可以使用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) 我试图将 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 中一样覆盖 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)
也许有另一种方法可以实现类似的功能?
我有一堂有两种方法的课程。
在 中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) 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 (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 ×8
enums ×2
java-stream ×2
classloader ×1
collect ×1
collectors ×1
concurrency ×1
dictionary ×1
firefox ×1
git-bash ×1
identifier ×1
instanceof ×1
java-home ×1
java-record ×1
lambda ×1
local-class ×1
scala ×1
scala-3 ×1
scope ×1
shell ×1
spring ×1
spring-mvc ×1
this-pointer ×1
warnings ×1