2017-02-14 1 views
2

Мне нужно изменить список на междунар как это следующим образом:Java 8: изменить конкретный элемент в потоке с помощью лямбда-выражения

  • Каждый элемент == 10 потребности быть удвоены

Здесь моя попытка:

list.stream() 
      .filter(val -> val.getValue() == 10) 
      .map(val -> { 
       val.doubleValue(); 
       return val; 
      }) 
      .forEach(System.out::println); 

проблема в том, что я фильтрации элементов, в то время как я хотел бы, чтобы держать их всех и просто изменить те, == 0.

EDIT: список состоит из элементов MyType, определяется как это следующим образом:

public class MyType { 

    private int val; 

    public MyType(int v){ 
     this.val = v; 
    } 

    public void doubleVal(){ 
     val*val; 
    } 

    public int getValue(){ 
     return val; 
    } 
} 

Любое предложение?

+0

Переместить условие в функцию карты и только увеличивать его, если оно выполнено? Возвращайте неизмененные значения во всех остальных случаях. – Henrik

+3

Вы квадратизируете val - не удваиваете его .... – DaveH

+1

'val.doubleValue()' не удваивает значение val, оно возвращает значение 'val' как' double' (т. Е. 10 становится 10.0). – Eran

ответ

7

Не использовать filter. Положите всю логику в map:

list.stream() 
    .map(val -> val == 10 ? 2*val : val) 
    .forEach(System.out::println); 

EDIT: Я упростил код после Вашего разъяснения, что элементы списка являются Integer s. Обратите внимание, что оригинал List остается без изменений.

+0

val является 'int' –

+1

@ Pavz7 Тогда' val.inc() 'не передает компиляцию. – Eran

+0

Вы правы, была опечатка. Я только что исправил это. Пытался запустить ваш пример «исправлено», но я не получаю значения обратно. Я получаю что-то вроде 'int @ 568db2f2' –

1

Оцените состояние на карте вместо фильтра.

List<Integer> list = new ArrayList<>(); 

    list.add(10); 
    list.add(5); 
    list.add(4); 

    list.stream().map(val -> { 
     if(val < 10){ 
      return val * val; 
     } 
     return val; 
    }).forEach(System.out::println); 

Это дает, как 10, 25 and 16;

1

Предполагая, что список является списком Val и Val-то вроде

class Val { 
    private int v; 

    public Val(int v) { 
    this.v = v; 
    } 
    int getValue() { 
    return v; 
    } 

    public void doubleValue() { 
    v *= 2; 
    } 
} 

затем

public static void main(String ... args) { 
     List<Val> ints = Arrays.asList(new Val(1), new Val(5), new Val(10), new Val(2)); 
     ints.stream().map((v) -> { 
      if (v.getValue() == 10) v.doubleValue(); return v; 
     }).forEach(v -> System.out.println(v.getValue())); 

    } 

будет делать трюк ,

+0

ОК .. это было основано на вопросе, когда у него было меньше информации;) – Redlab

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