lambdaj工具类中的 Lambda.maxFrom方法的实现
2016-04-09 12:50
417 查看
下面示例一个 lambdaj 工具类Lambda.maxFrom的使用(首先得导包哦)
方法说明; 输出集合中的指定对象属性最大值.
输出结果: 24
Tom
由于好奇, 自己动手把它实现了, 此为个人思考结果, 没有查看其源代码(其实是没有找到源代码
),
下面是关于 Lambda.maxFrom方法的实现.
代码:
--------Person.java------------
---------end of Person.java-----------
---------MyLambda.java--------------
--------end of MyLambda.java------------
--------测试---------
方法说明; 输出集合中的指定对象属性最大值.
<span style="font-size:18px;">List<Person> persons = new ArrayList<>(); persons.add(new Person("Hanyu", "20")); persons.add(new Person("King", "22")); persons.add(new Person("Tom", "21")); persons.add(new Person("Bob", "24")); System.out.println(Lambda.maxFrom(persons).getAge()); System.out.println(Lambda.maxFrom(persons).getName());</span>
输出结果: 24
Tom
由于好奇, 自己动手把它实现了, 此为个人思考结果, 没有查看其源代码(其实是没有找到源代码
),
下面是关于 Lambda.maxFrom方法的实现.
代码:
--------Person.java------------
package test; public class Person { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Person(String name, String age) { this.name = name; this.age = age; } public Person() { // TODO Auto-generated constructor stub } } ---------end of Person.java----------- ---------MyLambda.java-------------- package test; import java.io.File; import java.io.FileReader; import java.io.LineNumberReader; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class MyLambda { private static Iterable iterable1; private static String method = null; public static <T> T maxFrom(Iterable<T> iterable) { setMethod(); method = method.trim(); String methodName = method.substring(method.lastIndexOf(".") + 1, method.lastIndexOf("(")); Object maxResult = findMaxVal(iterable, methodName); T first = iterable.iterator().next(); try { String fieldName = methodName.substring(methodName.indexOf("t") + 1); Field field = first.getClass().getDeclaredField(fieldName.toLowerCase()); field.setAccessible(true); // 为该集合的第一个对象相比较的字段赋值, 然后返回 field.set(first, maxResult); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } iterable1 = iterable; return first; } private static List<String> fileLines = new ArrayList<>(); private static String fileName; public static void setMethod() { StackTraceElement[] ste = new Exception().getStackTrace(); setFileLines(ste); int lineNumber = ste[2].getLineNumber(); method = fileLines.get(lineNumber - 1); } private static void setFileLines(StackTraceElement[] ste) { // 追踪堆栈查找是哪一个方法调用了 maxFrom 方法 String className = getDirectory(ste[2].getClassName()); fileName = className; // 得到调用 maxFrom 方法的java文件的流, 然后将文件的行一次加到 List集合中, // 方便下次读取(用空间换时间) if ((fileLines != null && fileLines.size() == 0) || !fileName.equals(className)) { File file = new File("src/" + className + ".java"); try (LineNumberReader lnr = new LineNumberReader(new FileReader(file))) { String s = null; while ((s = lnr.readLine()) != null) { fileLines.add(s); } } catch (Exception e) { e.printStackTrace(); } } } public static <E> Object findMaxVal(Iterable<E> iterable, String methodName) { java.util.Iterator<E> it = iterable.iterator(); E first = it.next(); Object max = null; try { max = first.getClass().getDeclaredMethod(methodName).invoke(first); } catch (Exception e) { e.printStackTrace(); } Object retVal = null; while (it.hasNext()) { E e = it.next(); try { retVal = e.getClass().getDeclaredMethod(methodName).invoke(e); if (retVal != null && max != null) { if (retVal instanceof Comparable) { if (((Comparable) retVal).compareTo(max) > 0) { max = retVal; } } // todo...基本类型呢 } } catch (Exception e1) { e1.printStackTrace(); } } return max; } /** * * @param className * @return */ public static String getDirectory(String className) { className = className.replace(".", "/"); return className; } }
---------end of Person.java-----------
---------MyLambda.java--------------
package test; import java.io.File; import java.io.FileReader; import java.io.LineNumberReader; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class MyLambda { private static Iterable iterable1; private static String method = null; public static <T> T maxFrom(Iterable<T> iterable) { setMethod(); method = method.trim(); String methodName = method.substring(method.lastIndexOf(".") + 1, method.lastIndexOf("(")); Object maxResult = findMaxVal(iterable, methodName); T first = iterable.iterator().next(); try { String fieldName = methodName.substring(methodName.indexOf("t") + 1); Field field = first.getClass().getDeclaredField(fieldName.toLowerCase()); field.setAccessible(true); // 为该集合的第一个对象相比较的字段赋值, 然后返回 field.set(first, maxResult); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } iterable1 = iterable; return first; } private static List<String> fileLines = new ArrayList<>(); private static String fileName; public static void setMethod() { StackTraceElement[] ste = new Exception().getStackTrace(); setFileLines(ste); int lineNumber = ste[2].getLineNumber(); method = fileLines.get(lineNumber - 1); } private static void setFileLines(StackTraceElement[] ste) { // 追踪堆栈查找是哪一个方法调用了 maxFrom 方法 String className = getDirectory(ste[2].getClassName()); fileName = className; // 得到调用 maxFrom 方法的java文件的流, 然后将文件的行一次加到 List集合中, // 方便下次读取(用空间换时间) if ((fileLines != null && fileLines.size() == 0) || !fileName.equals(className)) { File file = new File("src/" + className + ".java"); try (LineNumberReader lnr = new LineNumberReader(new FileReader(file))) { String s = null; while ((s = lnr.readLine()) != null) { fileLines.add(s); } } catch (Exception e) { e.printStackTrace(); } } } public static <E> Object findMaxVal(Iterable<E> iterable, String methodName) { java.util.Iterator<E> it = iterable.iterator(); E first = it.next(); Object max = null; try { max = first.getClass().getDeclaredMethod(methodName).invoke(first); } catch (Exception e) { e.printStackTrace(); } Object retVal = null; while (it.hasNext()) { E e = it.next(); try { retVal = e.getClass().getDeclaredMethod(methodName).invoke(e); if (retVal != null && max != null) { if (retVal instanceof Comparable) { if (((Comparable) retVal).compareTo(max) > 0) { max = retVal; } } // todo...基本类型呢 } } catch (Exception e1) { e1.printStackTrace(); } } return max; } /** * * @param className * @return */ public static String getDirectory(String className) { className = className.replace(".", "/"); return className; } }
--------end of MyLambda.java------------
--------测试---------
<span style="font-size:18px;">@Test public void test2() { List<Person> persons = new ArrayList<>(); persons.add(new Person("Hanyu", "20")); persons.add(new Person("King", "22")); persons.add(new Person("Tom", "21")); persons.add(new Person("Bob", "24")); System.out.println(MyLambda.maxFrom(persons).getName()); } @Test public void test1() { List<Person> persons = new ArrayList<>(); persons.add(new Person("Hanyu", "20")); persons.add(new Person("King", "22")); persons.add(new Person("Tom", "21")); persons.add(new Person("Bob", "24")); System.out.println(MyLambda.maxFrom(persons).getAge()); }</span>
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树