2015-11-23 4 views
1

Я пытаюсь преобразовать код цикла Java в поток Java 8. У меня есть ArrayList из объектов, которые должны суммировать все deliveredLength, за исключением объектов , имеющих тот же контент, что и другой объект , который имеет одинаковый контент.Выбор отдельных объектов по пользовательскому полю через Stream API

Java Loops

public int getDeliveredLength() { 
    List<Row> distinct = new ArrayList<>(); 
    for (Row row : rows) { 
     if (sameContent(distinct, row)) { 
      continue; 
     } 
     distinct.add(row); 
    } 
    int sum = 0; 
    for (Row row : distinct) { 
     sum += row.getDeliveredLength(); 
    } 
    return sum; 
} 

private boolean sameContent(List<Row> list, Row other) { 
    for (Row row : list) { 
     if (other.sameContent(row)) { 
      return true; 
     } 
    } 
    return false; 
} 

Что бы код потока Java 8 будет?

public int getDeliveredLength() { 
    return rows.stream().filter(??).map(??).mapToInt(Row::getDeliveredLength).sum() 
} 
+0

Вы пробовали? Есть ошибки? – Phate01

+0

Также проверьте [this] (http://stackoverflow.com/q/27870136/4856258) и [это] (http://stackoverflow.com/q/32383428/4856258) вопрос. –

ответ

4

Почему вы пишете новый метод sameContent, и вы не переопределить метод equals? Использование equals имеет то преимущество, что многие классы и методы из стандартной библиотеки вызывают его для сравнения экземпляров вашего класса.

Учитывая, что вы используете equals, вы можете использовать стандартный метод Stream.distinct(), который возвращает поток различных значений. Таким образом, ваше выражение выражения Java 8 становится:

rows.stream().distinct().mapToInt(Row::getDeliveredLength).sum() 
+0

'Строка' может определяться не только содержимым. Например, его индекс – gontard

+0

Строка содержит начало, конец и комментарий и содержимое, поэтому equals и hashcode должны включать все поля. sameContent() только проверяет содержимое поля – Fireblaze

+2

Или 'Row' из внешней библиотеки. Его можно обернуть в пользовательский объект, имеющий правильный equals/hashCode, хотя, как в [этом ответе] (http://stackoverflow.com/a/23699499/1743880) – Tunaki

Смежные вопросы