我是Java map和filters8中的新用户.我目前正在使用Spark ML库来进行一些ML算法.我有以下代码:
// return a list of `Points`.
List<Points> points = getPoints();
List<LabeledPoint> labeledPoints = points.stream()
.map(point -> getLabeledPoint(point))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如果数据正确,则函数getLabeledPoint(Point point)返回new,LabeledPoint否则返回null.我怎样才能过滤(删除)null LabeledPoint对象map?
我想使用Java 8流API转换以下代码
List<Card> deck = new ArrayList<>();
for (Suit s: Suit.values())
{
for (Rank r: Rank.values())
{
deck .add(new Card(r, s));
}
}
Run Code Online (Sandbox Code Playgroud)
我出来了
List<Card> deck = new ArrayList<>();
Arrays.stream(Suit.values())
.forEach(s -> Arrays.stream(Rank.values())
.forEach(r -> deck.add(new Card(r, s))));
Run Code Online (Sandbox Code Playgroud)
但我不喜欢它,因为它在列表中有副作用.
还有另一种优雅的方式,从流生成列表而不是吗?
给出以下作为数据类的示例:
class Country {
List<Region> regions = new ArrayList<>();
List<Region> getRegions() {
return regions;
}
}
class Region {
String getName() {
return "some name";
}
}
Run Code Online (Sandbox Code Playgroud)
假设我有一份国家清单
List<Country> countries = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
我想将这些内容传递给他们的区域及其相应的名称我想做以下事情:
countries.stream().flatMap(Country::getRegions).map(Region::getName)...
Run Code Online (Sandbox Code Playgroud)
但是,该代码无法编译,因为"getRegions"的返回值是Collection(List),而不是flatMap方法接受的Stream.但是因为我知道任何Collection都可以通过其Collection.stream()方法进行流式传输,这应该不是问题.我还是被迫写成如下:
countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...
Run Code Online (Sandbox Code Playgroud)
这是(给定更丰富的背景)远比前者更不可读.
问题是,有什么理由,我错过了,因为这是那么笨重?我在我们的框架中有很多例子,我不得不采取这种方式,总是让我有一种酸味.(猜猜我只需要将Kotlin添加到我们的项目中并使用flatMap方法扩展Stream类,该方法采用Collection:p或者我?)
我有一个IndexEntry看起来像这样的课:
public class IndexEntry implements Comparable<IndexEntry>
{
private String word;
private int frequency;
private int documentId;
...
//Simple getters for all properties
public int getFrequency()
{
return frequency;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我将这个类的对象存储在Guava中SortedSetMultimap(每个键允许多个值),我将一个String单词映射到一些IndexEntrys.在幕后,它将每个单词映射到一个单词SortedSet<IndexEntry>.
我试图在文档中实现一种文档的单词索引结构及其出现频率.
我知道如何计算最常用的词,但我似乎无法得到这个词本身.
以下是我必须得到最常用词的计数,其中entries是SortedSetMultimap,与辅助方法一起:
public int mostFrequentWordFrequency()
{
return entries
.keySet()
.stream()
.map(this::totalFrequencyOfWord)
.max(Comparator.naturalOrder()).orElse(0);
}
public int totalFrequencyOfWord(String word)
{
return getEntriesOfWord(word)
.stream()
.mapToInt(IndexEntry::getFrequency)
.sum();
}
public SortedSet<IndexEntry> getEntriesOfWord(String word)
{
return entries.get(word); …Run Code Online (Sandbox Code Playgroud) 在阅读有关流的文档时,我遇到了以下句子:
...试图从行为参数中访问可变状态会给你一个错误的选择...如果你没有同步访问那个状态,你就有数据竞争,因此你的代码被破坏...... [1]
如果行为参数确实有副作用...... [没有]保证在同一个线程中执行同一流管道中"相同"元素的不同操作.[2]
对于任何给定元素,可以在任何时间以及库选择的任何线程中执行该动作.[3]
这些句子不区分顺序流和并行流.所以我的问题是:
如何根据以前的结果打破流计算?如果很明显stream.filter(...).count()会小于某个数字 - 如何停止流计算?
我有以下代码检查是否有人sampleData通过了predicate测试:
// sampleData.size() may be greater than 10.000.000
Set<String> sampleData = downloadFromWeb();
return sampleData.stream().filter(predicate::test).count() > sampleData.size() * coefficient;
Run Code Online (Sandbox Code Playgroud)
我可以有成千上万的sampleData.问题是这段代码无效.例如,如果coefficientequals 0.5,sampleData.size() = 10_000_000和第一个5_000_000元素失败predicate::test- 没有理由验证最后的5_000_000元素(count()永远不会大于5_000_000).
假设我在Java中有这个声明,没关系.
abstract class Start<T extends End> {
public T end;
}
abstract class End<T extends Start> {
public T start;
}
Run Code Online (Sandbox Code Playgroud)
然而,在Kotlin中它并不合适,因为Kotlin对"循环"类型参数有限制.
abstract class Start<T : End<*>> {
lateinit var end: T
}
abstract class End<T : Start<*>> {
lateinit var start: T
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以在Kotlin中解决这个问题,这样我可以拥有相互依赖的泛型类型吗?
我在Windows 10上运行Eclipse 2018-09(4.9.0).我正在使用Open JDK 11 GA.我有一个使用Java 8兼容源代码的项目,可以使用Eclipse和Maven中的JDK编译.
我想使用新的Java 11功能,所以首先我将编译器源/目标从Java 8更改为Java 11.它仍然在命令行上使用Maven构建查找,但无法在Eclipse中编译(参见Eclipse 2018-09 won)编译Java 11源代码;认为它低于1.7).
所以我在Eclipse Marketplace中添加了"Java 11 Support for Eclipse 2018-09"插件.我重新启动了Eclipse并用于Alt+F5刷新我的Maven项目.Eclipse然后尝试重建项目.
现在Eclipse进入了一个无限循环,在8X%完成到9X%完成之间跳跃,重复,无休止的错误如下:
!SESSION 2018-09-27 08:08:51.188 -----------------------------------------------
eclipse.buildId=4.9.0.I20180906-0745
java.version=11
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US
Framework arguments: -product org.eclipse.epp.package.jee.product
Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.jee.product
This is a continuation of log file …\.metadata\.bak_0.log
Created Time: 2018-09-27 08:11:22.981
!ENTRY org.eclipse.core.resources 4 2 2018-09-27 08:11:22.981
!MESSAGE Problems occurred when invoking code from plug-in: …Run Code Online (Sandbox Code Playgroud) 我有这段代码,我想重构Java 8
List<String> menus = new ArrayList<String>();
for (Menu menu : resto1.getMenu()) {
MainIngredient mainIngredient = MainIngredient.getMainIngredient(menu.getName());
if (mainIngredient.getIngredient().indexOf("Vegan")!=-1) {
menus.add(menu.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
重构这个简单的循环之后,似乎代码太多......我是否正确使用CompletableFutures?
ExecutorService executorService = Executors.newCachedThreadPool();
List<CompletableFuture<MainIngredient>> priceFutureList = resto1.getMenu().stream()
.map(menu -> CompletableFuture.supplyAsync(
() -> MainIngredient.getMainIngredient(menu.getName()), executorService))
.collect(Collectors.toList());
CompletableFuture<Void> allFuturesDone = CompletableFuture.allOf(
priceFutureList.toArray(new CompletableFuture[priceFutureList.size()]));
CompletableFuture<List<MainIngredient>> priceListFuture =
allFuturesDone.thenApply(v -> priceFutureList.stream()
.map(CompletableFuture::join)
.collect(toList()));
Run Code Online (Sandbox Code Playgroud) 目前,我被告知要对所有在某些服务器上挂出的.sql文件进行计数。手动解决这个非常基本的任务不是一个选择,相反,我编写了一些代码,该代码利用a SimpleFileVisitor<Path>并将找到的所有sql文件及其父路径存储在a中Map<Path, List<Path>>。
现在,我希望接收独立于其位置发现的sql文件总数。我使用增强for循环(几乎是经典方式)来工作:
public int getTotalAmountOfSqlFiles(Map<Path, List<Path>> sqlFilesInDirectories) {
int totalAmount = 0;
for (Path directory : sqlFilesInDirectories.keySet()) {
List<Path> sqlFiles = sqlFilesInDirectories.get(directory);
totalAmount += sqlFiles.size();
}
return totalAmount;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如何使用流API进行相同操作?
我无法使可编译代码正常工作,这显然没有做错事。不幸的是,
以下几行对我来说似乎是个好主意,但对编译器而言却不是。
totalAmount = sqlFilesInDirectories.entrySet().stream().map(List::size).sum();
Run Code Online (Sandbox Code Playgroud)
编译器说
无法推断以下类型的参数
<R> map(Function<? super T,? extends R>
有谁知道我在做什么错(也许使用解决方案提供了一些受过教育的流API)?