是否可以为Java 8 并行流指定自定义线程池?我找不到任何地方.
想象一下,我有一个服务器应用程序,我想使用并行流.但是应用程序很大且是多线程的,因此我想将它划分为区分.我不想在另一个模块的应用程序块任务的一个模块中执行缓慢的任务.
如果我不能为不同的模块使用不同的线程池,这意味着我无法在大多数现实情况下安全地使用并行流.
请尝试以下示例.在单独的线程中执行一些CPU密集型任务.这些任务利用并行流.第一个任务被破坏,因此每个步骤需要1秒(通过线程休眠模拟).问题是其他线程卡住并等待损坏的任务完成.这是一个人为的例子,但想象一下servlet应用程序和有人向共享fork连接池提交长时间运行的任务.
public class ParallelTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(() -> runTask(1000)); //incorrect task
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
}
private static void runTask(int delay) {
range(1, 1_000_000).parallel().filter(ParallelTest::isPrime).peek(i -> Utils.sleep(delay)).max()
.ifPresent(max -> System.out.println(Thread.currentThread() + " " + max));
}
public static boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor …
Run Code Online (Sandbox Code Playgroud) 有没有一种简洁的方法来迭代流,同时有权访问流中的索引?
String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"};
List<String> nameList;
Stream<Integer> indices = intRange(1, names.length).boxed();
nameList = zip(indices, stream(names), SimpleEntry::new)
.filter(e -> e.getValue().length() <= e.getKey())
.map(Entry::getValue)
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
与那里给出的LINQ示例相比,这似乎相当令人失望
string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
Run Code Online (Sandbox Code Playgroud)
有更简洁的方法吗?
此外,看起来拉链已移动或被移除......
我在许多网站上阅读过Optional只能用作返回类型,而不能在方法参数中使用.我很难找到合乎逻辑的原因.例如,我有一个逻辑,它有2个可选参数.因此,我认为像这样编写我的方法签名是有意义的(解决方案1):
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
许多网页指定Optional不应该用作方法参数.考虑到这一点,我可以使用以下方法签名并添加一个清晰的Javadoc注释来指定参数可能为null,希望将来的维护者将读取Javadoc,因此在使用参数之前始终执行空值检查(解决方案2) :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
或者,我可以用四种公共方法替换我的方法以提供更好的界面并使其更明显p1和p2是可选的(解决方案3):
public int calculateSomething() {
calculateSomething(null, null);
}
public int calculateSomething(String p1) {
calculateSomething(p1, null);
}
public int calculateSomething(BigDecimal p2) {
calculateSomething(null, p2);
}
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试编写类的代码,为每种方法调用这条逻辑.我首先从另一个返回Optional
s的对象中检索两个输入参数然后调用calculateSomething
.因此,如果使用解决方案1,则调用代码将如下所示:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
Run Code Online (Sandbox Code Playgroud)
如果使用解决方案2,则调用代码将如下所示:
Optional<String> …
Run Code Online (Sandbox Code Playgroud) 我想转换java.time.LocalDate
成java.util.Date
类型.因为我想将日期设置为JDateChooser
.或者是否有支持java.time
日期的日期选择器?
我想总结一个整数列表.它的工作原理如下,但语法感觉不对.代码可以优化吗?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
Run Code Online (Sandbox Code Playgroud) 在Java 8中,方法可以创建为Lambda表达式,并且可以通过引用传递(通过一些工作).有大量的在线示例,lambdas被创建并与方法一起使用,但没有关于如何使用lambda作为参数的方法的示例.那是什么语法?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
Run Code Online (Sandbox Code Playgroud) 我在Java 8中玩lambdas,我遇到了警告local variables referenced from a lambda expression must be final or effectively final
.我知道当我在匿名类中使用变量时,它们必须在外部类中是最终的,但仍然 - 最终和有效最终之间有什么区别?
Java 8最有用的功能之一是default
接口上的新方法.基本上有两个原因(可能还有其他原因)为什么会被引入:
Iterator.remove()
Iterable.forEach()
从API设计者的角度来看,我希望能够在接口方法上使用其他修饰符,例如final
.在添加便捷方法时,这将非常有用,可防止在实现类时出现"意外"覆盖:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Run Code Online (Sandbox Code Playgroud)
如果Sender
是一个类,上面已经是常见的做法:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Run Code Online (Sandbox Code Playgroud)
现在,default
并final
有明显矛盾的关键字,但默认关键字本身不会一直严格要求 …
Java 8添加了一个新的java.time API来处理日期和时间(JSR 310).
我有日期和时间作为字符串(例如"2014-04-08 12:30"
).如何LocalDateTime
从给定的字符串中获取实例?
在我完成LocalDateTime
对象的使用之后:如何将LocalDateTime
实例转换回具有与上面所示格式相同的字符串?
由于我使用Maven,因此我能够在我的本地存储库项目中构建和安装具有不完整Javadoc标记的项目(例如,缺少参数).
但是,由于我迁移到Java 8(1.8.0-ea-b90),当我尝试构建或安装Javadoc不是Javadoc的项目时,Maven绝对严格缺少文档标记,并向我展示了许多与Javadoc问题相关的Javadoc错误"完善".我试图在我的本地存储库中编译和安装的一些项目是我无法控制的第三方项目.因此,在我的场景中,仅修复所有这些项目中的所有Javadoc的解决方法似乎并不可行.
这是我mvn clean package install
在项目中执行时看到的输出的一小部分:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.026s
[INFO] Finished at: Mon Apr 08 21:06:17 CEST 2013
[INFO] Final Memory: 27M/437M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.9:jar (attach-javadocs) on project jpc: MavenReportException: Error while creating archive:
[ERROR] Exit code: 1 - /Users/sergioc/Documents/workspaces/heal/jpc/src/main/java/org/jpc/engine/prolog/PrologDatabase.java:10: error: @param name not found
[ERROR] * @param terms the terms to assert
[ERROR] ^
[ERROR] /Users/sergioc/Documents/workspaces/heal/jpc/src/main/java/org/jpc/engine/prolog/PrologDatabase.java:11: warning: no description for @return
[ERROR] * …
Run Code Online (Sandbox Code Playgroud)