Javaの8:条件に基づいてマップにリストやアドオンを反復処理します

Arpanダス:

私は反復処理だリストを持って、それぞれの要素のいくつかの条件で、私は、Java 7のコードが続き、特定の位置にデータ構造にリストの各要素を追加しています。

私は、リストから各要素を追加していたデータ構造です、

/* The data structure has two slots, one for parents and another for children */
MenuBar menuBar = new MenuBar();

今のコードスニペットはあります、

MenuBar menuBar = new MenuBar();
for (Menu menu : menuList) {
    if (isParentMenu(menu.getId())) {
        menuBar.addMenu(menu);
    } else {
        Menu parent = getMenuById(menu.getParentId());
        menuBar.addChildMenu(parent, menu);
    }
}

今、私は同じ、次のようにJavaの8コードと同等を作成するために、私が何をしようとしていますされて苦しんでいます、

// The following code is not complete , just trying
   menuList.stream().filter(menu -> isParentMenu(menu.getId()))
   .map(menu -> menuBar.addMenu(menu))
スイーパー:

私は正直に言うと、あなたのコードを変更する必要があるとは思いません。それが今であるとして、それは明らかに十分です。ストリームにそれを変更することも、ループよりも、それはあまりパフォーマンス作り、いくつかのオーバーヘッドを追加することができます。

本当に簡単ストリームソリューションは次のようになります。

MenuBar menuBar = new MenuBar();
menuList.stream().forEach(x -> {
    if (isParentMenu(x.getId())) {
        menuBar.addMenu(x);
    } else {
        Menu parent = getMenuById(x.getParentId());
        menuBar.addChildMenu(parent, x);
    }
});

別の方法としては、使用することができますpartitioningBy

Map<Boolean, List<Menu>> map = menuList.stream().collect(Collectors.partitioningBy(x -> isParentMenu(x.getId())));
map.get(true).stream().forEach(menuBar::addMenu);
map.get(false).stream().forEach(x -> {
    Menu parent = getMenuById(x.getParentId());
    menuBar.addChildMenu(parent, x);
});

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=239864&siteId=1