该Stream.reduce方法以a BinaryOperator为参数.a的函数签名BinaryOperator是(T,T) -> T.该BigDecimal::min方法在其方法签名中只有1个参数(即.(T) -> T).
当我传递BigDecimal::min给Stream.reduce方法时,为什么编译器不会抱怨?
示例代码:
List<BigDecimal> bigDecimalList = new ArrayList<>();
bigDecimalList.add(BigDecimal.valueOf(1));
bigDecimalList.add(BigDecimal.valueOf(2));
bigDecimalList.add(BigDecimal.valueOf(3));
BigDecimal minResult = bigDecimalList.stream().reduce(BigDecimal::min).orElse(BigDecimal.ZERO);
Run Code Online (Sandbox Code Playgroud)
谢谢.
我想知道有没有办法摆脱警告findFirst().get()而不使用.orElse()如果我100%知道每次都有结果,所以我永远不会到达那里NoSuchElementException.例如,让我们看看以下代码:
List<String> myList = new ArrayList<>();
myList.add("Test");
myList.add("Example");
myList.add("Sth");
String fisrstString = myList.stream().findFirst().get(); // here I surely get "Test"
Run Code Online (Sandbox Code Playgroud)
我不知道其他IDE如何对待它,但是我的IDE(IntelliJ)将其视为警告('Optional.get()' without 'isPresent()').我想可能它不知道你何时可以到达NoSuchElementException那里,何时不到,或者我不知道为什么.我知道有办法解决这个警告(isPresent()检查.orElse(something)),但有无用的代码,所以我不想使用这些解决方案,因为它们是如此不必要.你知道我该怎么做,或解释这是怎么回事?
编辑:对不起NPE,它有NoSuchElementException我的错误,但我认为这个问题仍然存在.
我对中间阶段的顺序的状态的问题-从施加到一个阶段的操作的所有输入流(项目)或是所有级/操作施加到各流项目?
我知道这个问题可能不容易理解,所以我举一个例子.在以下流处理中:
List<String> strings = Arrays.asList("Are Java streams intermediate stages sequential?".split(" "));
strings.stream()
.filter(word -> word.length() > 4)
.peek(word -> System.out.println("f: " + word))
.map(word -> word.length())
.peek(length -> System.out.println("m: " + length))
.forEach(length -> System.out.println("-> " + length + "\n"));
Run Code Online (Sandbox Code Playgroud)
我对这段代码的期望是它会输出:
f: streams
f: intermediate
f: stages
f: sequential?
m: 7
m: 12
m: 6
m: 11
-> 7
-> 12
-> 6
-> 11
Run Code Online (Sandbox Code Playgroud)
相反,输出是:
f: streams
m: 7
-> 7
f: intermediate
m: …Run Code Online (Sandbox Code Playgroud) 以下代码工作正常:
Stream.of("key1", "key2")
.map(key -> {
SomeObject foo = service.find(key);
if (foo == null) {
throw new RuntimeException("No entity found with key: " + key);
}
return foo;
})
// ...
Run Code Online (Sandbox Code Playgroud)
但是,当我从Optional使用orElseThrow时:
Stream.of("key1", "key2")
.map(key -> Optional.ofNullable(someService.find(key))
.orElseThrow(() -> new RuntimeException("No entity found with key: " + key)))
// ...
Run Code Online (Sandbox Code Playgroud)
我得到一个编译时错误:
错误:(129,33)java:未报告的异常X; 必须被抓住或宣布被抛出
两者都抛出一个RuntimeException,为什么使用Optional的方法不起作用的任何想法?
更新:我的构建基础架构,我尝试使用IntelliJ和Maven编译它:
$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T17:41:47+01:00)
Maven home: C:\Tools\apache-maven-3.3.9
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_91\jre
Default locale: de_AT, …Run Code Online (Sandbox Code Playgroud) 有两个类和两个相应的列表:
class Click {
long campaignId;
Date date;
}
class Campaign {
long campaignId;
Date start;
Date end;
String type;
}
List<Click> clicks = ..;
List<Campaign> campaigns = ..;
Run Code Online (Sandbox Code Playgroud)
并希望找到所有Click的clicks:
列表中有相应Campaign的campaigns,即Campaign具有相同的campaignIdAND
这Campaign有type="预期"和
这Campaigns.start< click.date<Campaigns.end
到目前为止,我有以下实现(这对我来说似乎令人困惑和复杂):
clicks.
stream().
filter(click -> campaigns.stream().anyMatch(
campaign -> campaign.getCampaignType().equals("prospecting") &&
campaign.getCampaignId().equals(click.getCampaignId()) &&
campaign.getStart().after(click.getDate()) &&
campaign.getEnd().before(click.getDate()))).
collect(toList());
Run Code Online (Sandbox Code Playgroud)
我想知道这个问题是否有更简单的解决方案.
我不是 Swift 程序员,所以我对这门语言一无所知。我只是出于好奇才问。我遇到了一种语言构造,其中变异函数内部被分配了一个新值,如下例中的self函数所示。moveByAssigmentToSelf
struct Point {
var x = 0.0
var y = 0.0
mutating func moveByAssigmentToSelf(_ deltaX: Double, _ deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
mutating func moveByMutatingMembers(_ deltaX: Double, _ deltaY: Double) {
self.x += deltaX
self.y += deltaY
}
}
Run Code Online (Sandbox Code Playgroud)
来自 C/C++/Java/C# 背景,我认为它是self指向内存中某处(例如堆栈上)的结构值(开始)的指针(地址)。this对我来说,分配给C++ 结构中应该等效的东西看起来很奇怪。AFAICT,该函数moveByMutatingMembers应该具有观察上等效的效果,并且在 C++/Java 世界中是很自然的事情。
有人可以向非 Swift 程序员解释一下这个概念背后的基本原理/想法是什么吗?
我在语言参考(关于表达式的章节)中所能找到的只是以下模糊的陈述:“在初始化器、下标或实例方法中, self 指的是它出现的类型的当前实例。” 和“在值类型的变异方法中,您可以将该值类型的新实例分配给 self。”
我想要理解的是为什么这个分配是一个好主意,与传统的解决方案相比,它解决了哪些编程问题?
换句话说:为什么从语言设计的角度来看这有意义?或者:如果您必须使用 C++/Java …
我在Android工作室的一个git项目上与一个团队合作,我希望看到每个作者在编写的行或行编辑等方面的贡献...是否有这样的工具/插件可以显示统计信息作者?
我想找出一个字符串流是否至少有一个出现在另一个字符串String中Set<String>.我想出了两个解决方案.
性能方面,哪种方法最好/推荐?
1)
return source.stream().filter(this::streamFilter).count() > 0;
Run Code Online (Sandbox Code Playgroud)
2)
return source.stream().anyMatch(this::streamFilter);
Run Code Online (Sandbox Code Playgroud)
这是streamFilter方法:
private boolean streamFilter(String str) {
return filterKeywords.contains(str.toLowerCase());
}
Run Code Online (Sandbox Code Playgroud)
filterKeywords: private Set<String> filterKeywords;
或者有更好的方法吗?
我有这几个函数,我想知道是否可以将参数传递deviceEvent.hasAlarm()给.map(this::sendSMS)
private void processAlarm (DeviceEvent deviceEvent) {
notificationsWithGuardians.stream()
.filter (notification -> notification.getLevels().contains(deviceEvent.getDeviceMessage().getLevel()))
.map(this::sendSMS)
.map(this::sendEmail);
}
private DeviceAlarmNotification sendSMS (DeviceAlarmNotification notification, DeviceEvent deviceEvent) {
if (deviceEvent.hasAlarm()) {
}
return notification;
}
Run Code Online (Sandbox Code Playgroud) 我有一个整数列表,说list1,我想得到另一个列表list2,它将包含从开始到当前索引为止的累积总和。如何使用Stream API Java 8做到这一点?
List<Integer> list1 = new ArrayList<>();
list1.addAll(Arrays.asList(1, 2, 3, 4));
List<Integer> list2 = new ArrayList<>();
// initialization
list2.add(list1.get(0));
for(int i=1;i<list1.size();i++) {
// increment step
list2.add(list2.get(i-1) + list1.get(i));
}
Run Code Online (Sandbox Code Playgroud)
如何将上述命令式代码转换为声明式代码?
list2 should be [1, 3, 6, 10]
Run Code Online (Sandbox Code Playgroud)