如何通过使用流

时间:2018-07-03 14:14:24

标签: java java-8 hashmap java-stream

请在下面提供此代码,以帮助我

我得到这样的输出

Enter name:Chaya
[455-567-8888, 655-884-4557, 811-115-5556]
Enter phone: 7666644556
7666644556 = [Chaya]
I need to get an output like this
Enter name: Chaya
455-567-8888
655-884-4557
811-115-5556
Enter phone: 7666644556
7666644556 = Bhanu

我无法解决名称输出的问题,因为它输出的是“ Chaya”而不是“ Bhanu”。我可以使用toString方法来打印电话号码值吗?
请详细.....

public class PhNo 
{
    private static String name;
    private static long phno;

    public static void main(String[] args) 
    {
            HashMap<String, List<Long>> map = new HashMap<String, List<Long>>();
            List<Long> One = new ArrayList<Long>();
            One.add(1111111111L);
            One.add(9444445555L);

            List<Long> Two = new ArrayList<Long>();
            Two.add(7666644556L);

            List<Long> Three = new ArrayList<Long>();
            Three.add(4555678888L);
            Three.add(6558844557L);
            Three.add(8111155556L);

            List<Long> Four = new ArrayList<Long>();
            Four.add(4555678899L);
            Four.add(6558844566L);
            Four.add(8666655556L);

            map.put("Arya", One);
            map.put("Bhanu", Two);            
            map.put("Chaya", Three);
            map.put("Dhamu", Four);

            System.out.println("Enter name: ");
            Scanner userInput = new Scanner(System.in); 
            name = userInput.nextLine();

            List<Long> phoneNum = map.get(name);
            System.out.println(String.valueOf(phoneNum).replaceAll("(\\d{3})(\\d{3})(\\d+)", "$1-$2-$3"));                    

            System.out.println("Enter phone: ");              
            phno = userInput.nextLong();    

            System.out.println(phno+" = "+ getKeysByValue(map));

     }

    static List<String> getKeysByValue(Map<String, List<Long>> map) 
    {
     return map.entrySet()
              .stream()
              .filter(entry -> Objects.equals(entry.getKey(), name))
              .map(Map.Entry::getKey)
              .collect(Collectors.toList());        
    }
}

1 个答案:

答案 0 :(得分:3)

您可以使用:

static String getName(Map<String, List<Long>> users, Long phone) throws Exception {
    return users.entrySet()
            .stream()
            .filter(entry -> entry.getValue().contains(phone))
            .findFirst()
            .map(user -> user.getKey())
            .orElseThrow(() -> new Exception("No result found"));
}

注意:

  • 您的方法名称应为重要名称(而不是将其更改为getName
  • 我假设您的方法应返回String(具有此电话号码的用户名)而不是Long列表
  • 如果您的方法找不到任何结果怎么办? (您可以抛出异常)
  • 如果将phno值作为第二个参数传递给方法(感谢Conffusion),然后像这样getName(map, phno)
  • 那样调用您的方法,则代码将更具可读性
  • 您使用的设计一点都不好,相反,我建议创建一个拥有用户名和电话号码列表的用户类别,这将易于阅读和操作。
  • 变量名称应小写而不是大写

Of如果您想获得拥有该电话号码的所有用户名,则可以使用:

static List<String> getNameOfUsersByPhoneNumber(Map<String, List<Long>> map, Long phone) {
    return map.entrySet()
            .stream()
            .filter(entry -> entry.getValue().contains(phone))
            .map(entry->entry.getKey())
            .collect(Collectors.toList());
}