嗨,我有一个函数,我将返回无限的并行流(是的,在这种情况下它要快得多)生成的结果。所以很明显(或不)我用过
Stream<Something> stream = Stream.generate(this::myGenerator).parallel()
Run Code Online (Sandbox Code Playgroud)
它有效,但是......当我想限制结果时它不会(当流是顺序的时一切都很好)。我的意思是,当我做类似的事情时,它会产生结果
stream.peek(System.out::println).limit(2).collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)
但即使peek输出产生超过 10 个元素,collect仍然没有最终确定(生成很慢,所以这 10个元素甚至可能需要一分钟)......这是一个简单的例子。实际上,限制这些结果是未来,因为主要期望是在用户终止进程之前只获得比最近的结果更好的结果(其他情况是首先返回我可以通过抛出异常findFirst所做的事情,如果没有其他帮助[没有,即使我在控制台上有更多元素并且在大约 30 秒内没有更多结果])。
如何复制?我的想法也是使用 RxJava,还有另一个问题 - 如何使用该工具(或其他工具)实现类似的结果。
public Stream<Solution> generateSolutions() {
final Solution initialSolution = initialSolutionMaker.findSolution();
return Stream.concat(
Stream.of(initialSolution),
Stream.generate(continuousSolutionMaker::findSolution)
).parallel();
}
new Solver(instance).generateSolutions()
.map(Solution::getPurpose)
.peek(System.out::println)
.limit(5).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
实施findSolution并不重要。它有一些副作用,比如添加到解决方案仓库(singleton、sych 等),但仅此而已。
我正在 Java8 中工作/测试流,遇到了非常令人沮丧的问题。我有编译好的代码:
List<String> words = Arrays.asList("Oracle", "Java", "Magazine");
List<String> wordLengths = words.stream().map((x) -> x.toUpperCase())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
第二个(几乎相同)抛出警告:
List<String> words = Arrays.asList("Oracle", "Java", "Magazine");
List<String> wordLengths = words.stream().map((x) -> {
x.toUpperCase();
}).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
警告:
The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments ((<no type> x) -> {})
Run Code Online (Sandbox Code Playgroud)
这个额外的括号有什么变化?
Comparable 和 Comparator 是功能接口,Comparator 也被声明为 @FunctionalInterface 但为什么 Comparable 在 jdk 1.8 中没有声明为 @FunctionalInterface 虽然它是其中之一?
我正在尝试使用java 8 中新的\R正则表达式匹配器。但是,对于以下代码:
public static void main(String[] args)
{
String s = "This is \r\n a String with \n Different Newlines \r and other things.";
System.out.println(s);
System.out.println(Pattern.matches("\\R", s));
if (Pattern.matches("\\R", s)) // <-- is always false
{
System.out.println("Matched");
}
System.out.println(s.replaceAll("\\R", "<br/>")); //This is a String with <br/> Different Newlines <br/> and other things.
}
Run Code Online (Sandbox Code Playgroud)
将Pattern.matches始终返回false,其中作为replaceAll方法似乎找到了比赛和做什么,我想它。如何使 Pattern.matches 工作?
我也试过很长的路,但仍然无法让它工作:
Pattern p = Pattern.compile("\\R");
Matcher m = p.matcher(s);
boolean b = m.matches();
System.out.println(b);
Run Code Online (Sandbox Code Playgroud) 如果我运行以下代码:
"testx".split("x")
Run Code Online (Sandbox Code Playgroud)
期望我们会得到{"test", ""},但 java 正在返回{"test"}
但"xtest".split("x")返回{"", "test"}。任何想法为什么它的行为很奇怪(或)我有错误的理解吗?
这是我的 JDK 和系统信息:
JRE:1.8.0_152-release-1024-b6 amd64
JVM:JetBrains sro 的 OpenJDK 64 位服务器 VM
Linux 4.4.0-34-generic
我有 Android Studio 3.0 项目结构中的设置 - JDK 位置 -"C:\Java\jdk1.8"还有我的 1.8 jdk。但是在这台 PC 上,JAVA_HOME 变量设置为"C:\Java\jdk1.7".
然后我无法打开Android设备监视器。我收到一个日志文件说:
java.version=1.7.0_80
....
org.osgi.framework.BundleException: The activator com.android.ide.eclipse.monitor.MonitorPlugin for bundle com.android.ide.eclipse.monitor is invalid
Caused by: java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocation$AndroidLocationException : Unsupported major.minor version 52.0
Run Code Online (Sandbox Code Playgroud)
在不更改 JAVA_HOME 的情况下,如何使用 jdk1.8 运行 Android Studio?
我在处理 3.3.6 中有以下代码片段:
menuBarButtons.add(new TextButton("File", 0, 0, 20, menuBarHeight, (() -> println("Test")) ));
但是,处理给出了错误
Lambda expressions are allowed only at source level 1.8 or above
通过更改构建路径/运行配置中的 JRE,这在任何普通的 Java IDE 中都很容易修复,但我在设置中找不到任何选项。我尝试将更新的 JRE 复制粘贴到处理文件夹中,但无济于事。
我正在打印一个按键排序的地图,中间对象 LinkedHashMap 如下;
LinkedHashMap<String, AtomicInteger> sortedMap = wcMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
sortedMap.forEach((k, v) -> System.out.println(String.format("%s ==>> %d",k, v.get())));
Run Code Online (Sandbox Code Playgroud)
如何在收集之前直接从流中打印它?
我目前正在审查 Android 应用程序的更改,这些更改将应用程序升级为使用 Java 8。
在审查期间,我注意到以下代码被加下划线作为错误:
List<MappableTask> tasks = Observable.fromIterable(taskMapHoldingPresenter.getMappableTasks())
.filter(isMappableTask)
.toList()
.blockingGet();
Run Code Online (Sandbox Code Playgroud)
现在显示以下内容:
Incompatible Types.
Required: List<MappableTask>
Found: List<capture<? extends MappableTask>>
Run Code Online (Sandbox Code Playgroud)
该getMappableTasks()方法在接口中定义如下:
List<? extends MappableTask> getMappableTasks();
Run Code Online (Sandbox Code Playgroud)
请注意,这MappableTask是由各种模型类实现的接口。
怎么是List<MappableTask> list = taskMapHoldingPresenter.getMappableTasks();无效的?
此代码按预期构建。如上所述,在升级应用程序以使用 Java 8 之前未显示此错误。为什么会出现此问题?
如何@NonNull在List项目上使用注释。
让我们考虑一下,如果我想强制一个非空的字符串列表
我们可以这样声明: @NonNull List<String>
如果我们想强制,一个非空字符串列表。
我们怎么能做到这一点?
java-8 ×10
java ×6
java-stream ×3
android ×2
annotations ×1
interface ×1
lambda ×1
non-nullable ×1
openjdk ×1
processing ×1
regex ×1
rx-java ×1
rx-java2 ×1