我对任何语言的答案感到满意,但我最终想要用Java解答.(Java 8+很好.不仅限于Java 8.我试图修复标签.)
如果我有两个Optional<Integer>值,我如何简洁地计算等价物a || b,意思是:a如果它被定义; 否则b,如果已定义; 否则empty()?
Optional<Integer> a = ...;
Optional<Integer> b = ...;
Optional<Integer> aOrB = a || b; // How to write this in Java 8+?
Run Code Online (Sandbox Code Playgroud)
我知道我可以写a.orElse(12),但如果默认的"值"也是Optional怎么办?
显然,在C#中,运营商??做了我想要的.
我有温度等级
class Temperature {
double minTemp;
double maxTemp;
String city;
String country;
}
Run Code Online (Sandbox Code Playgroud)
我有另一个维护温度集合的类
class Temperatures {
List<Temperature> temperatures;
}
Run Code Online (Sandbox Code Playgroud)
我想使用streams对countryName进行分组.
我想要的是
public Map<String, Temperatures> temperaturesByCountry()
Run Code Online (Sandbox Code Playgroud)
但我无法使用流将温度作为地图值,我得到的是温度列表.
我的分组实现如下
Map<String, List<Temperature>> result = this.getTemperatures()
.stream()
.collect(Collectors.groupingBy(Temperature::getCountry));
Run Code Online (Sandbox Code Playgroud)
我想要Map<String, Temperatures>而不是Map<String, List<Temperature>>
我怎样才能做到这一点.
如果我有2个Streams,如下面所示的方法
public Stream<Transaction> getPendingTransaction(Stream<PendingTransaction> pendingTransactionStream,Stream<ProcessedTransaction> processedTransactionStream){ }
Run Code Online (Sandbox Code Playgroud)
我想找到其中存在的所有对象中pendingTransactionStream同样存在于processedTransactionStream基于像一些标准
if
transaction.getId()对于存在的Transaction对象是相同的,pendingTransactionStream并且processedTransactionStreamthen该对象是相同的,我们可以在列表中收集它们.
我尝试这样做,但它给出了错误
processedTransactionStream
.filter( (processedTransaction)->
{
pendingTransactionStream.anyMatch(s->s.getTransactionId().equals(processedTransaction.getTransactionId()) );
}
).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud) 为了清理数据列表,我创建了一个接受数据列表和要执行的清理操作列表的方法。
public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) {
List<T>dataNew=data.stream().map((str) -> {
T cleanData = str;
for(Function<T,T> function:cleanOps) {
cleanData=function.apply(cleanData);
}
return cleanData;
}).collect(Collectors.toList());
return dataNew;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我们在Collectors.toList()返回一个新列表时再次创建整个列表。我们可以在不使用额外空间的情况下获得相同的结果吗?
下面是调用代码:
public void processData() {
List<Function<String, String>> cleanOps = new ArrayList<>();
cleanOps.add(String::toLowerCase);
cleanOps.add(str -> str.replaceAll(" ", ""));
List<String> data = new ArrayList<>();
data.add("John Doe");
data.add("Jane Doe");
System.out.println(Arrays.toString(cleanData(data, cleanOps).toArray()));
}
Run Code Online (Sandbox Code Playgroud) 我在Windows 上安装了Java9(Oracle网站上当前可用的版本)(Windows 10 x64 Professional,也是最新的,作为vmware虚拟机运行 - > VMware Workstation 12).我添加jdk\bin到用户路径并尝试使用Git Bash执行命令,但即使JShell启动,它也不会在按下后执行任何命令Enter,它只是坐在那里而不做任何事情.
有趣的是,它与Windows的默认命令行完美的作品CMD或Powershell.如果我没记错,Git Bash是基于Cygwin的.这可能是什么原因?
此外,它没有直接连接JShell,但我在一台不同的机器上有一些类似的问题,有一些命令行工具,如JHipster(适用于CMD但不适用于GitBash).
必要的截图: -
编辑:使用jshell -v并没有什么区别.此外,使用任何REPL帮助程序命令,/help或/help intro使shell也停止.
是否可以在模块路径上拥有2个具有完全相同名称(但内容略有不同)的模块?
据我所知,Java 9编译器并没有抱怨它.我有2个模块声明如下:
module com.dj.helper {
exports com.dj.helper;
}
Run Code Online (Sandbox Code Playgroud)
两者都包含com.dj.helper包,但在包内的内容是不同的.然后在我的主应用程序中,我想要导入此模块:
module com.dj {
requires com.dj.helper;
}
Run Code Online (Sandbox Code Playgroud)
具有相同名称的两个模块都在我的模块路径上.
我希望在编译我的com.dj模块时,编译器会抱怨同一模块存在两次,但事实并非如此.这是否有效地意味着您可以在模块路径上拥有相同jar的2个版本,而Java将不知道使用哪个版本?
我创建了一个具有以下结构的多模块项目
myproject
|- mymodule
|- src
|- main
|- java
|- com
|- mymodule
|- Util.java
|-newmodule
|-src
|-main
|-java
|-com
|-newmodule
|- Main.java
|-module-info.java
Run Code Online (Sandbox Code Playgroud)
现在我想使用 Util.java,它是模块化模块 newmodule 中的非模块化代码。我已经在 newmodule 中声明了以下内容
module newmodule {
requires mymodule;
}
Run Code Online (Sandbox Code Playgroud)
项目编译正常,但 Intellij 显示模块未找到并且包 com.mymodule 在未命名模块中声明,模块“newmodule”不读取它。
如何解决这个问题?
还有一个问题,如果我什至不模块化遗留模块,所有旧的非模块化代码是否在默认情况下都会变成 java 9 中的自动模块?
我有一堂课,如下所示:
@Data
@Builder
public class Foo {
private String param;
/** My custom builder.*/
public static FooBuilder builder(String _param){
return builder().param(_param);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
[错误]无法在项目foo上执行目标org.apache.maven.plugins:maven-javadoc-plugin:2.10.4:javadoc(default-cli):JavaDocs报表生成中发生错误:
[错误]退出代码: 1-/home/workspace/foo/src/main/java/com/foo/Foo.java:34:错误:找不到符号
[ERROR]公共静态FooBuilder builder(String _param)
[ERROR] ^
[ERROR]符号: FooBuilder类
[错误]位置:Foo类
我发现了一个关于 peek 方法的 Java 8 Stream API 的测验,如下所示
Arrays.asList("Fred", "Jim", "Sheila")
.stream()
.peek(System.out::println)
.allMatch(s -> s.startsWith("F"));
Run Code Online (Sandbox Code Playgroud)
输出是
Fred
Jim
Run Code Online (Sandbox Code Playgroud)
我很困惑这个流是如何工作的?我的预期结果应该是
Fred
Jim
Sheila
Run Code Online (Sandbox Code Playgroud)
peek() 方法是一个中间操作,它处理 Stream 中的每个元素。谁能给我解释一下。
我希望 Java 14 记录实际上比类似的数据类使用更少的内存。
他们或内存使用相同吗?
java ×9
java-8 ×5
java-9 ×4
java-stream ×4
java-module ×2
git-bash ×1
grouping ×1
hashmap ×1
java-14 ×1
java-record ×1
javadoc ×1
jshell ×1
lombok ×1
maven ×1
maybe ×1
migration ×1
module-info ×1
optional ×1