java - 将循环重构为android中的流

标签 java android java-stream

我想将 for 循环重构为流:

for (TrackingGroup item : trackingGroups) {
    List<IItem> items = new ArrayList<>();
    items.add(new ItemText(getActivity().getString(R.string.track_title) + " " + trackingGroup.getTitle()));
    for (ProfileAnswerItem answerItem : listofAnswers) {
        for (TrackingItem trackingItem : item.getItems()) {
            if (trackingItem.getId() == answerItem.getId()) {
                ItemQuestionResult itemView = new ItemQuestionResult(new ItemAnswer(item.getId(), answerItem.getId(), answerItem.getText(), false, true),
                        items.size() > 1);
                items.add(itemView);
               // adapter.add(itemView);
            } else {
                if (item.getId() == answerItem.getTrackId() && answerItem.isCustom()) {
                    ItemQuestionResult itemView = new ItemQuestionResult(new ItemAnswer(item.getId(), answerItem.getId(), answerItem.getText(), false, true),
                            items.size() > 1);
                    if (answerItem.getId() != lastID) {
                        items.add(itemView);
                        //adapter.add(itemView);
                        lastID = answerItem.getId();
                    }
                }
            }
        }
    }
    adapter.add(items);
}

这就是我此刻所拥有的:

Stream.of(trackingGroups)
                .forEach(trackingGroup1 -> {
                    List<IItem> items = new ArrayList<>();
                    items.add(new ItemText(getActivity().getString(R.string.track_title) + " " + trackingGroup.getTitle()));
                    Stream.of(listofAnswers)
                            .forEach(profileAnswerItem -> {
                                Stream.of(trackingGroup1.getItems())
                                        .forEach(trackingItem -> {
                                            if (trackingItem.getId() == profileAnswerItem.getId()) {
                                                ItemQuestionResult itemView = new ItemQuestionResult(new ItemAnswer(trackingGroup1.getId(),
                                                        profileAnswerItem.getId(), profileAnswerItem.getText(), false, true),
                                                        items.size() > 1);
                                                items.add(itemView);
                                            } else {
                                                if (trackingGroup1.getId() == profileAnswerItem.getTrackId() && profileAnswerItem.isCustom()) {
                                                    ItemQuestionResult itemView = new ItemQuestionResult(new ItemAnswer(trackingGroup1.getId(),
                                                            profileAnswerItem.getId(), profileAnswerItem.getText(), false, true),
                                                            items.size() > 1);
                                                    if (profileAnswerItem.getId() != lastID) {
                                                        items.add(itemView);
                                                        lastID = profileAnswerItem.getId();
                                                    }
                                                }
                                            }
                                        });
                            });
                });

现在我遇到了变量 lastID 的问题。对于 lambda,这个变量应该是最终的。如何添加缺失的部分,然后在适配器中添加结果?

最佳答案

没有理由在这里使用流。 Streams are useful when defining sophisticated data processing queries.它们提供了一种紧凑而富有表现力的方式来定义流元素上的顺序操作,如 Oracle 提供的示例:

List<Integer> transactionsIds = 
    transactions.stream()
                .filter(t -> t.getType() == Transaction.GROCERY)
                .sorted(comparing(Transaction::getValue).reversed())
                .map(Transaction::getId)
                .collect(toList());

.stream().forEach(...)(或者Stream.of(...).forEach(...))是一段代码闻。您正在构建一个流并立即将其解构为对元素的常规迭代。常规的 forfor each 结构在这里看起来既简单又清晰,除非您也重构循环体的内容。

关于java - 将循环重构为android中的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46784100/

相关文章:

java - 在android中的BroadcastReceiver类的onReceive方法中访问ArrayList项目

Java 8 Stream,得到头和尾

具有批处理功能的 Java 8 Stream

java - 想要借助正则表达式替换标签中的值属性吗?

java - 在 Java 中提取标签值对的正则表达式

android - 无法使用 abortBroadcast() 阻止 SMS?

android - 在android中更改我的ActionBar的背景颜色

java - 在Java中读取未知长度的Gzip文件

java - 使用 proguard 混淆 jar 文件

java - 为什么总是newInstance或者fragment对象