1

我正在学习 Java 8 Lambda 和一元功能接口。我有一个关于“功能”类的练习作业,使用HashMap以下步骤:

  1. Function<Set, Map>创建一个接收 aSetHashMap使用 lambda 表达式创建 a 的类型变量

  2. 将单词放在地图中,使用该单词的大写首字母作为键

  3. 执行 lambda 表达式并查看结果

我尝试以下方式,但它不起作用。我认为问题出在 lambda 表达式中,但我想了解我必须做什么(为简单起见,我将同一个词作为键)。这样,结果为“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}

4

4 回答 4

2

我认为这意味着您必须在以下两条规则words中添加所有SetMap

  • 关键是大写的第一个字母
  • 价值就是这个词

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>>
于 2018-05-17T15:34:28.823 回答
2

我敢打赌你误解了你的问题。

您可能需要一个从集合中每个项目的值中获取键的函数。所以:

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;
    };
于 2018-05-17T15:36:13.543 回答
1
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));
}
于 2018-05-17T15:45:54.153 回答
0
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<String>,Map> function=set ->{

              Map<String,String> mapSet=new HashMap<>();

              set.forEach(valueOfSet->mapSet.put(valueOfSet.substring(0,1).toUpperCase(),valueOfSet));'

              return mapSet;
        };
        System.out.println(function.apply(hs));
   }
}

如果不使用功能,您可以按如下方式执行:

Map<String,String> mapSet=new HashMap<>();
hs.forEach(value->mapSet.put(value.substring(0,1),value));
System.out.println(mapSet);
于 2020-08-28T09:48:43.590 回答