HashMap в унарном функциональном интерфейсе с лямбдой в Java 8 - PullRequest
0 голосов
/ 17 мая 2018

Я учусь на Java 8 Лямбда и Унарный функциональный интерфейс.У меня есть практическое назначение для класса «Function» с использованием HashMap, для чего нужно выполнить следующие шаги:

  1. Создать переменную типа Function<Set, Map>, которая получает Set и создаетa HashMap с использованием лямбда-выражений

  2. Поместите слова в карту, используя в качестве ключа первую букву этого слова в верхнем регистре

  3. Выполните лямбда-выражениеи посмотреть результат

Я пытаюсь следующим образом, но это не работает.Я думаю, что проблема в лямбда-выражении, но я хочу понять, как я должен это сделать (для простоты я поставил то же самое слово, что и ключ).Таким образом, результат равен «null».

import java.util.*;
import java.util.function.Function;

public class FunctionTest {

public static void main(String[] args) {
        HashSet<String> hs = new HashSet<String>();
        hs.add("ciao");
        hs.add("hello");
        hs.add("hallo");
        hs.add("bonjour");

        Function<Set, Map> setToMap = s2 -> (Map) new HashMap().put(s2,s2);

        System.out.println(setToMap.apply(hs));
   }
}

Для приведенного выше примера ожидаемый результат должен быть {B=bonjour, C=ciao, H=hello}.

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Могу поспорить, что вы немного неправильно поняли свою проблему.

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

Set<String> set = new HashSet<>();
set.add("ciao");
set.add("hello");
set.add("bonjour");

Function<String, Character> keyExtractor = s -> Character.toUpperCase(s.charAt(0));

Map<Character, String> map = set.stream()
        .collect(Collectors.toMap(keyExtractor, Function.identity()));

Это предполагает, что у вас есть только одно слово для каждой буквы.

Если вы хотите иметь более одной записи для каждой первой буквы, вы можете сделать:

Set<String> set = new HashSet<>();
set.add("ciao");
set.add("hello");
set.add("hallo");
set.add("bonjour");

Function<String, Character> keyExtractor = s -> Character.toUpperCase(s.charAt(0));

Map<Character, List<String>> map = set.stream()
        .collect(Collectors.groupingBy(keyExtractor));

Если вы хотите сделать это без потоков, это будет сложнее, но возможно:

Function<Set<String>, Map<Character, List<String>>> setConverter = set -> {
      Map<Character, List<String>> map = new HashMap<>();

      for (String s : set) {
        Character key = Character.toUpperCase(s.charAt(0));
        map.compute(key, (k, v) -> {
          if (v == null) {
            List<String> newList = new ArrayList<>();
            newList.add(s);
            return newList;
          } else {
            v.add(s);
            return v;
          }
        });
      }

      return map;
    };
0 голосов
/ 17 мая 2018
public class Main {

public static void main(String[] args) {
    HashSet<String> hs = new HashSet<String>();
    hs.add("ciao");
    hs.add("hello");
    hs.add("hallo");
    hs.add("bonjour");
    //System.out.println(setToList.apply(hs));

    Function<Set<String>, Map<String,String>> setToMap = s2 -> {
        HashMap<String, String> map = new HashMap<>();
        for ( String o : s2)
        {
            map.put(o.toUpperCase(), o);
        }
            return map;
        };

    System.out.println(setToMap.apply(hs));
}
0 голосов
/ 17 мая 2018

Я думаю, это означает, что вы должны добавить все words из Set в Map, следуя 2 правилам

  • ключ - первая буква в верхнем регистре
  • значением является слово

Function<Set<String>, Map<Character, String>> setToMap = aSet -> {
    Map<Character, String> map = new HashMap<>();
    for (String s : aSet ) {
        map.put(s.toUpperCase().charAt(0), s);
    }
    return map;
};
// or using Streams :
Function<Set<String>, Map<Character, String>> setToMap = aSet  -> 
      aSet.stream().collect(Collectors.toMap(s -> s.toUpperCase().charAt(0), 
                                             Function.identity(),
                                             (oldK, newK) -> oldK)); // merging function in cas of duplicate key

Совет: не используйте необработанные типы, но указывайте их как можно больше:

  • Function<Set,Map> становится Function<Set<String>, Map<Character, String>>
...