I am trying to move an object to the end of the list if it has a boolean flag set to true. The following works where I am taking the route of deleting it and adding it back. Is there a better more elegant way to do this in Java 8? I have to work with that boolean flag to identify if object needs to go to end of list. Please advice.
public class Main {
public static void main(String[] args) {
Item item1 = new Item();
item1.setName("item1");
Item item2 = new Item();
item2.setName("item2");
item2.setMoveToLast(true);
Item item3 = new Item();
item3.setName("item3");
Item item4 = new Item();
item4.setName("item4");
List<Item> items = new ArrayList<>(Arrays.asList(item1, item2, item3, item4));
System.out.println("Before moving...");
items.forEach(System.out::println);
// only item2 has flag set to true thus only item2 will be sent to end of list.
move(items);
System.out.println("After moving...");
items.forEach(System.out::println);
}
private static void move(List<Item> items){
for (int i = 0; i < items.size(); i++) {
Item item = items.get(i);
if (item.isMoveToLast()){
items.remove(item);
items.add(item);
}
}
}
}
@Getter
@Setter
class Item {
private int order;
private String name;
private boolean isMoveToLast;
@Override
public String toString() {
return "Item{" +
"name='" + name + '\'' +
", isMoveToLast=" + isMoveToLast +
'}';
}
}
This is not elegant:
Map<Boolean,List<Item>> partitionBy = items.stream()
.collect(Collectors.partitioningBy(Item::isMoveToLast));
Stream.of(partitionBy.get(false),partitionBy.get(true)).flatMap(List::stream)
.collect(Collectors.toList());
Or based on @Holger's comment:
Stream.concat(partitionBy.get(false).stream(), partitionBy.get(true).stream())
.collect(Collectors.toList());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With