小编Ste*_*bel的帖子

在Java 8中映射后过滤空值

我是Java mapfilters8中的新用户.我目前正在使用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 filter java-8 java-stream

8
推荐指数
1
解决办法
1万
查看次数

使用Java 8流转换经典嵌套for循环

我想使用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)

但我不喜欢它,因为它在列表中有副作用.

还有另一种优雅的方式,从流生成列表而不是吗?

java for-loop nested-loops java-8 java-stream

8
推荐指数
1
解决办法
3146
查看次数

为什么Stream.flatMap不能接受集合?

给出以下作为数据类的示例:

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或者我?)

java collections java-8 java-stream flatmap

8
推荐指数
1
解决办法
361
查看次数

如何使用Java 8流获取Map中最常用的单词以及相应的出现频率?

我有一个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>.

我试图在文档中实现一种文档的单词索引结构及其出现频率.

我知道如何计算最常用的词,但我似乎无法得到这个词本身.

以下是我必须得到最常用词的计数,其中entriesSortedSetMultimap,与辅助方法一起:

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)

java multimap java-8 java-stream

8
推荐指数
1
解决办法
437
查看次数

Java,哪个线程是顺序流执行的?

在阅读有关流的文档时,我遇到了以下句子:

  • ...试图从行为参数中访问可变状态会给你一个错误的选择...如果你没有同步访问那个状态,你就有数据竞争,因此你的代码被破坏...... [1]

  • 如果行为参数确实有副作用...... [没有]保证在同一个线程中执行同一流管道中"相同"元素的不同操作.[2]

  • 对于任何给定元素,可以在任何时间以及库选择的任何线程中执行该动作.[3]

这些句子不区分顺序流和并行流.所以我的问题是:

  1. 在哪个线程中执行顺序流的管道?它始终是调用线程还是可以自由选择任何线程的实现?
  2. 在流是顺序的情况下,哪个线程是forEach终端操作的action参数?
  3. 使用顺序流时是否必须使用任何同步?

java foreach java-8 java-stream

8
推荐指数
1
解决办法
632
查看次数

根据以前的计算结果停止java流计算

如何根据以前的结果打破流计算?如果很明显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 java-8 java-stream

8
推荐指数
1
解决办法
118
查看次数

如何解决Kotlin中有限束限制的违反?

假设我在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中解决这个问题,这样我可以拥有相互依赖的泛型类型吗?

generics kotlin

8
推荐指数
2
解决办法
1728
查看次数

Eclipse 2018-09使用Java 11插件进入无限构建循环:ClosedFileSystemException

我在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 eclipse maven java-11 eclipse-2018-09

8
推荐指数
1
解决办法
1020
查看次数

Java8中的CompletableFuture

我有这段代码,我想重构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)

java java-8 java-stream completable-future

8
推荐指数
1
解决办法
122
查看次数

重构使用流API的方法

目前,我被告知要对所有在某些服务器上挂出的.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)?

java sum java-8 java-stream

8
推荐指数
1
解决办法
384
查看次数