这两种循环方式之间有什么区别,哪一种更适合使用?

时间:2017-04-02 15:58:42

标签: java arraylist collections lambda

我在netbeans 8.1下编码我正在使用for循环,我很想知道IDE会建议代码格式化,所以我的原始循环是:

    List<Produit> produits = pjc.findProduitEntities();
    for (Produit produit : produits) {
        System.out.println("p ="+produit.getTitre());
        observableArrayList.add(new FXProduit(produit));
    }

我最后得到两个建议,我想了解它们是否相同,或者存在一些性能或内存管理差异。

第一个建议名为use functional operation based on lambda expression

    List<Produit> produits = pjc.findProduitEntities();
    produits.stream().map((produit) -> {
        System.out.println("p ="+produit.getTitre());
        return produit;
    }).forEach((produit) -> {
        observableArrayList.add(new FXProduit(produit));
    });

第二个使用inner class paradigm

    List<Produit> produits = pjc.findProduitEntities();
    produits.stream().map(new Function<Produit, Produit>() {
        @Override
        public Produit apply(Produit produit) {
            System.out.println("p ="+produit.getTitre());
            return produit;
        }
    }).forEach((produit) -> {
        observableArrayList.add(new FXProduit(produit));
    });

1 个答案:

答案 0 :(得分:1)

匿名类版本最不具吸引力,因为它会为每次需要垃圾回收的调用创建一个新类和新实例。

使用peek(),并行流和方法引用可以清理和改进流版本:

pjc.findProduitEntities().parallelStream()
    .peek(produit -> System.out.println("p ="+produit.getTitre()))
    .map(FXProduit::new)
    .forEach(observableArrayList::add);

我假设并行处理没问题,因为对象最终在一个可观察的上下文中,顺序没有区别。即使没有并行流(即只使用.stream()),代码仍然更加清晰。