2015-07-30 3 views
2

Я начинающий программист.Лучший способ получения булевых значений в Java

У меня возник вопрос о том, как вернуть значение boolean.

Какой вам нравится? По какой причине?

1.

public boolean methodA(List<String> targetList){ 
    boolean result = false;   
     for(String str : targetList){ 

      if(str.equals("word1")) { 
       result = true; 
       break; 
      } 
      if(str.equals("word2")) { 
       result = true; 
       break; 
      } 
     } 
    return result; 
} 

2.

public boolean methodB(List<String> targetList){ 
    boolean result = false;   
     for(String str : targetList){ 

      if(str.equals("word1")) { 
       return true; 
      } 
      if(str.equals("word2")) { 
       return true; 
      } 
     } 
    return result; 
} 
+3

Почему бы не избавиться от вашего логического «результата» вообще и просто «вернуть false» в нижней части вашего примера №2? Читает, по-моему, –

+0

После того, как компиляторы Java и JIT сделаны с этим кодом, нет никакой разницы.В общем, начните с написания кода, который прост в обслуживании, и сосредоточьтесь на улучшении ваших алгоритмов и структур данных. Беспокоитесь о микро-оптимизации только после того, как у вас все будет работать, и вы увидите, какие улучшения необходимы. – keshlam

+0

Все сводится к тому, как вы любите читать/писать свой код, я старая школа, мне нравится одна запись и одна точка выхода для всех моих методов, подумайте, растет ли код, чтобы операторы return отображали несколько экранов (вы нужно прокрутить), вы можете быстро потерять или пропустить «возврат», которые могут затруднить выполнение логики, поэтому лично я предпочитаю пример # 1 – MadProgrammer

ответ

4

Это то, что вы в конечном итоге делает, как только ваш код становится абсурдно большой:

public boolean methodB(List<String> targetList) 
{ 
    for(String str : targetList) 
     if(str.equals("word1") || str.equals("word2")) 
      return true; 

    return false; 
} 
+2

Ваш код на месте, но ваше отсутствие фигурных скобок является ужасающим. – Makoto

+3

@ Макото - га! Скрывает ли это стрижку? Я нахожу его менее захламленным лично. – FirebladeDan

+1

Но есть так много веских причин. Расширяя тела, избегая болтаться еще ... Это похоже на защитную сетку. Каждый нуждается в одном или двух. На всякий случай. –

0

Второй метод лучше, потому что если он найдет поисковый запрос, он не будет тратить время на другие значения.

Лучший способ для этого будет:

public boolean methodC(List<String> list) { 
    for (String str : list) 
     if (str.equals("word1") || str.equals("word2")) return true; 
    return false; 
} 

или в Java 8/1.8: (Поправьте меня, если это не так!)

public boolean methodD(List<String> list) { 
    yes: { 
     list.forEach(str -> {if(str.equals("word1") || str.equals("word2")) break yes;}); 
    return false; 
    } 
    return true; 
} 
+0

Мне очень жаль, что поздно ответить. , и я очень замалчиваю ваши ответы. –

4
public boolean methodABC(List<String> list) { 
    return list.contains("word1") || list.contains("word2"); 
} 
+2

Единственная «проблема» в этом состоит в том, что список может быть выполнен как можно более дважды, если word1 не найден – Shar1er80

1

Использование потоков, очень простой однострочный:

public boolean methodA(List<String> targetList){ 
    return targetList.stream().anyMatch(s -> s.equals("word1") || s.equals("word2")); 
} 
0

methodA() является хорошей причиной, поскольку он следует структурированному программированию с одним входом/с одним выходом и выполняет итерацию списка только один раз.

methodA() очищен:

public static boolean methodA(List<String> targetList) { 
    boolean result = false;   
    for(String str : targetList){ 
     if(str.equals("word1") || str.equals("word2")) { 
      result = true; 
      break; 
     } 
    } 
    return result; 
} 

methodB() хорошо, потому что это всего лишь несколько строк короче, итерация по списку раз, занимает меньше памяти (без использования результата boolean, ОЧЕНЬ МЕЛКАЯ память сохранить), возвращается сразу после успеха.

methodB() очищены:

public boolean methodB(List<String> targetList){ 
    for(String str : targetList){ 
     if(str.equals("word1") || str.equals("word2")) { 
      return true; 
     } 
    } 
    return false; 
} 

После изучения потоков, один вкладыш, который следует за однократные/одного выхода структурированного программирования и итерацию списка только один раз.

public static boolean methodX(List<String> targetList){ 
    return targetList 
      .stream() 
      .anyMatch(target -> target.equals("word1") || target.equals("word2")); 
} 

Использование:

public static void main(String[] args) throws Exception { 
    List<String> targets1 = new ArrayList() {{ 
     add("hello"); 
     add("goodbye"); 
    }}; 

    System.out.println(methodA(targets1)); 

    List<String> targets2 = new ArrayList() {{ 
     add("hello"); 
     add("goodbye"); 
     add("word1"); 
    }}; 

    System.out.println(methodA(targets2)); 

    List<String> targets3 = new ArrayList() {{ 
     add("hello"); 
     add("goodbye"); 
     add("word2"); 
    }}; 

    System.out.println(methodA(targets3)); 
} 

Результаты:

false 
true 
true 

Что касается производительности, все они перебирать список только один раз, так ИМО это просто сводится к личным предпочтениям, как, к которому лучше всего использовать. Для меня это было бы methodX()

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