2016-03-31 4 views
1

мне нужно запустить две разные задачи на основе целого месива фильтровJava 8 Lambda ручки для> если> еще

Я только сейчас схватив понятие Лямбд, так что я думаю, мой вопрос, как вы справляетесь с несколькими «другими» условиями, содержащими сложную логику ... внутри лямбда?

Я знаю, что я могу использовать фильтр и карту, чтобы выбрать определенные фрагменты данных. Как «вложенность» работает с фильтрами?

Могу ли я сделать что-то вроде:

//Iterate over list of sites 
sites.stream() 
//Check if current site is active 
.map(isActive ? 
//{Do something with site because site is active}; 
//Set a variable for later user maybe? 
: 
//{Do something else involving the current site because it's not?}; 
//Set a different variable maybe? 
); 

//use variable from first map? 

Может кто-то дать мне какой-то правильный синтаксис и, возможно, основное объяснение того, что я делаю, чтобы мои данные, когда я бегу через эти абстрактные процессы, которые делают меня бамбук.

Во-вторых, если бы я хотел запустить эти два процесса карты параллельно, я бы просто сделал это?

sites.stream().parallel()? 

Как обычно, спасибо за помощь в моем незнании!

+1

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html? –

+0

Думаю, вам лучше придерживаться традиционного программирования для этих задач. –

+0

Просто я полностью поняла ... если у меня есть два простых пути к программе, выполните задачу 1, если true, выполните задачу 2, если false, lambdas на самом деле не способ? – TheFunk

ответ

3

Я бы поставил сложную логику в отдельный метод и ссылался на нее в map(…).

sites.stream() 
    .map(Foo::bar) 
    …; 

Это будет использовать метод в классе Foo, которые могли бы выглядеть следующим образом:

public static String bar(Site site) 
{ 
    return site.toString(); 
} 

Конечно, вы можете использовать произвольную логику в методе, но он должен быть свободен от побочных эффектов.

И да, если метод, используемый для сопоставления, является потокобезопасным, вы можете использовать parallel() для параллельного выполнения сопоставлений.

1

Вы просто использовать равнину, просто if:

.map(site -> { 
    if (isActive) { 
    ...whatever... 
    } else { 
    ...whatever else... 
    } 
}) 
... 
+0

В этот момент, в чем преимущество использования потоков/карты? – TheFunk

+2

@ TheFunk Нет. Lambdas и потоки не всегда являются лучшим решением. –

4

Некоторые примеры использования лямбда:

Вы можете сгруппировать ваши сайты по активной и неактивной, после того, что вы можете выполнить некоторую логику и , Поместите большую логику в метод, а затем вызовите функцию map().

Вы можете использовать filter(), а также получить только часть потока.

public class Lambda { 

    static class Site { 

     public boolean isActive; 
     public boolean otherCondition; 
     public boolean isActive() { 
      return isActive; 
     } 

     public boolean isOtherCondition() { 
      return otherCondition; 
     } 

     public void setProperty(String property) { 

     } 
    } 
    public static Site someOperation(Site site) { 

     //some code 

     return site; 
    } 
    public static void main(String[] args) { 

     ArrayList<Site> sites = new ArrayList<>(); 

     Map<Boolean, List<Site>> groupedSites = sites.stream().collect(Collectors.groupingBy(Site::isActive));   
     groupedSites.get(Boolean.TRUE).stream().filter(Site::isOtherCondition).map(Lambda::someOperation).forEach(p -> p.setProperty("something")); 

    } 
} 
+0

Спасибо! Это очень полезно! Теперь я могу использовать несколько процессоров для работы в нескольких списках за один раз, а код намного менее сложный.Возможно, немного более запутанным, но менее сложным в целом! – TheFunk

+0

@ TheFunk Добро пожаловать –

+0

Вы можете заменить 'Collectors.groupingBy (Site :: isActive)' на 'Collectors.partitioningBy (Site :: isActive)'. Затем вы получите карту, оптимизированную для сопоставления точно «истинных» и «ложных» значений, и у нее будет пустой список, если нет совпадения, поэтому последующая команда groupedSites.get (Boolean.TRUE) .stream () 'в этом случае не будет вызывать' NullPointerException'. Кроме того, помните, что есть перегрузка, которая принимает сборщик нисходящего потока для выполнения операции сразу при сборе, вместо того чтобы хранить все в списке и выполнять операцию потока после этого. – Holger

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