How to get element index when using a stream to traverse a list?

android, java, java-8, java-stream, lambda

Solution

Here's how I would do it.

Run an `IntStream` over the indexes of the list. Then filter the indexes based on whether the corresponding checkbox is selected. Then map the index value, an `int`, into a `String` representation of index value. Finally, collect the strings into a result string, separated by commas.

Code:

    String result = IntStream.range(0, checkBoxes.size())
                             .filter(i -> checkBoxes.get(i).isSelected())
                             .mapToObj(String::valueOf)
                             .collect(Collectors.joining(","));

The output will be something like

    0,1,3,6

depending upon which checkboxes are actually checked.

I would avoid using `forEach` since you can accomplish the goal by transforming values instead of performing side effects. I would also avoid `List.indexOf` since that searches the list linearly for the desired item. It's not a big deal if you have only a few checkboxes, but if you have a lot, the O(N^2) growth will cause performance to suffer.

Problem

I want to get index when traverse list use lambda. For example: ``` List<CheckBox> checkBoxes = null; checkBoxes.forEach(checkBox -> { if (checkBox.isSelected()) { sb.append("index"); //I want to get checkbox index here sb.append(","); } }); ``` EDIT: The `checkBoxes = null;` is just a placeholder but will be used properly once I start writing some code.

Original source