转载:论Java8中switch(String)的解决方案真实性

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_17776287/article/details/77154881

今天在浏览博客的时候,看到一篇关于"java8中switch(String)的错误解决"的博文。具体问题是说jdk1.7支持switch(String),但是在jdk1.8中却不行,就此提出的解决方案。然而,针对jdk1.8,已经使用过一年之久的博主存在一个困惑,平时开发项目jdk1.8也有用到过switch(String),但是并未发现过此问题,想来jdk通常都是向前兼容的,不该出现此问题啊。难道我遇到是个假jdk1.8?于是就此进行了代码验证。

jdk版本以及jre版本:


代码一:


 
 
  1. package com.jangz.syntax.nosupport;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. public class ValidateUtil {
  5. private static final Logger log = LoggerFactory.getLogger(ValidateUtil.class);
  6. private boolean checkName(String fileName, String name, String op) {
  7. switch(op) {
  8. case "no":
  9. return false;
  10. case "contains":
  11. return fileName.contains(name) ? true : false;
  12. case "equals":
  13. return fileName.equals(name)? true : false;
  14. case "noequal":
  15. return fileName.equals(name) ? false : true;
  16. default:
  17. log.info( "wrong op:{}", op);
  18. break;
  19. }
  20. return false;
  21. }
  22. public static void main(String[] args) {
  23. String FILE_NAME = "/usr/local/share/applications/doc.txt";
  24. String NAME = "usr/local/";
  25. boolean result = new ValidateUtil().checkName(FILE_NAME, NAME, "contains");
  26. System.out.println( "ValidateUtil result: " + result);
  27. }
  28. }
测试结果如下:


结果显示,jdk1.8直接使用switch(String)并没有问题。


代码二:


 
 
  1. package com.jangz.syntax.nosupport;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. enum op {
  5. no, contains, equals, noequal
  6. }
  7. public class ValidateUtilCor {
  8. private static final Logger log = LoggerFactory.getLogger(ValidateUtilCor.class);
  9. private boolean checkName(String fileName, String name, op p) {
  10. switch (p) {
  11. case no:
  12. return true;
  13. case contains:
  14. return fileName.contains(name) ? true : false;
  15. case equals:
  16. return fileName.equals(name) ? true : false;
  17. case noequal:
  18. return fileName.equals(name) ? false : true;
  19. default:
  20. log.info( "wrong op:{}", p);
  21. break;
  22. }
  23. return false;
  24. }
  25. public static void main(String[] args) {
  26. String FILE_NAME = "/usr/local/share/applications/doc.txt";
  27. String NAME = "usr/local/";
  28. boolean result = new ValidateUtilCor().checkName(FILE_NAME, NAME, op.contains);
  29. System.out.println( "ValidateUtilCor result: " + result);
  30. }
  31. }
测试结果如下:


综上,jdk1.8是支持switch(String)的啊?!什么鬼?于是博主又去看了下发表该博文的日期,稍加思索,觉得应该是jdk1.8在后期的新版本中进行了修改调整吧。


不论如何,以后开发项目过程中,如果各位使用的是jdk1.8,那么可以放心使用switch(String),当然,如果也出现同样问题——jdk1.8不支持switch(String),则可以通过代码二的枚举形式进行替代解决。切不可为了使用一个语法糖就选择临时更换jdk版本,这样会得不偿失。好了,博主要开始工作了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里给出一个可能的解决方案: ``` import java.util.*; public class ListMatcher { /** * 按照n个key对两个类型不同的list进行match的共通方法 * @param list1 第一个list * @param list2 第二个list * @param n 匹配的key数 * @param <T> 第一个list元素类型 * @param <U> 第二个list元素类型 * @return 匹配结果,返回一个Map,key为第一个list符合条件的元素,value为第二个list匹配的元素 */ public static <T, U> Map<T, U> matchLists(List<T> list1, List<U> list2, int n) { Map<T, U> result = new HashMap<>(); for (T t : list1) { // 获取t对象的前n个key,假设对象t有一个getKey方法可以获取到这些key List<Object> keys = getKey(t, n); // 遍历list2,找到符合条件的元素 for (U u : list2) { // 获取u对象的前n个key List<Object> uKeys = getKey(u, n); // 判断两个对象是否匹配 if (keys.equals(uKeys)) { result.put(t, u); break; } } } return result; } /** * 获取对象的前n个key,这里假设对象有一个getKey方法可以获取到这些key * @param obj 对象 * @param n key数 * @return 前n个key组成的List */ private static List<Object> getKey(Object obj, int n) { // 这里简单地假设对象有一个getKey方法可以获取到前n个key // 实际情况需要根据具体对象的属性和需求进行修改 List<Object> keys = new ArrayList<>(); for (int i = 0; i < n; i++) { keys.add(obj.getKey(i)); } return keys; } } ``` 使用示例: ``` public class Main { public static void main(String[] args) { List<Person> personList = new ArrayList<>(); personList.add(new Person("Tom", 20, "Male")); personList.add(new Person("Jerry", 18, "Male")); personList.add(new Person("Alice", 25, "Female")); List<Student> studentList = new ArrayList<>(); studentList.add(new Student("Tom", 123456, "Computer")); studentList.add(new Student("Jerry", 789012, "Math")); studentList.add(new Student("Bob", 654321, "English")); Map<Person, Student> result = ListMatcher.matchLists(personList, studentList, 1); for (Map.Entry<Person, Student> entry : result.entrySet()) { System.out.println(entry.getKey() + " matches " + entry.getValue()); } } } class Person { private String name; private int age; private String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public int getAge() { return age; } public String getGender() { return gender; } public Object getKey(int i) { switch (i) { case 0: return name; case 1: return age; case 2: return gender; default: throw new IndexOutOfBoundsException("Invalid key index."); } } @Override public String toString() { return name + ", " + age + ", " + gender; } } class Student { private String name; private int id; private String major; public Student(String name, int id, String major) { this.name = name; this.id = id; this.major = major; } public String getName() { return name; } public int getId() { return id; } public String getMajor() { return major; } public Object getKey(int i) { switch (i) { case 0: return name; case 1: return id; case 2: return major; default: throw new IndexOutOfBoundsException("Invalid key index."); } } @Override public String toString() { return name + ", " + id + ", " + major; } } ``` 输出结果: ``` Tom, 20, Male matches Tom, 123456, Computer Jerry, 18, Male matches Jerry, 789012, Math ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值