qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java 8的一些常見用法

           lambda表達式
            語法
            最常用的:
            Runnable runnable = () -> System.out.println("Hello!");
            Thread t = new Thread(runnable);
            t.start();
            t.join();
            你還可以這么寫:
            Thread t = new Thread(() -> System.out.println("Hello!"));
            t.start();
            t.join();
            帶有參數的呢?
          Comparator<String> stringComparator = (s1, s2) -> s1.compareTo(s2);
          擴展成一個完整的表達式:
          Comparator<String> stringComparator = (String s1, String s2) -> {
          System.out.println("Comparing...");
          return s1.compareTo(s2);
          };
            函數式接口
            Lambda表達式使得你可以更緊湊地表達出單方法類。單一方法類也被稱作函數式接口,它可以通過
            @FunctionalInterface來進行注解:
          @FunctionalInterface
          public interface MyFunctionalInterface<T> {
          boolean test(T t);
          }
          // Usage
          MyFunctionalInterface<String> l = s -> s.startsWith("A");
            方法引用
            方法引用就是更緊湊,易懂的Lambda表達式,它適用于那些已經有名字的方法。來看一個簡單的例子:
          public class Sample {
          public static void main(String[] args) {
          Runnable runnable = Sample::run;
          }
          private static void run() {
          System.out.println("Hello!");
          }
          }
            還有一個:
          public static void main(String[] args) {
          Sample sample = new Sample();
          Comparator<String> stringLengthComparator = sample::compareLength;
          }
          private int compareLength(String s1, String s2) {
          return s1.length() - s2.length();
          }
            Stream API基礎
            stream是一個元素序列,它支持串行及并行的操作。
            遍歷列表
            List<String> list = Arrays.asList("one", "two", "three", "four", "five", "six");
            list.stream()
            .forEach(s -> System.out.println(s));
           過濾
          Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
          Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
          list.stream()
          .filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
          .forEach(s -> System.out.println(s));
            排序
          Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
          Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
          Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
          Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();
          list.stream()
          .filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
          .sorted(byLastLetter.thenComparing(byLength))
          .forEach(s -> System.out.println(s));
            大小限制
          Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
          Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
          Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
          Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();
          list.stream()
          .filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
          .sorted(byLastLetter.thenComparing(byLength))
          .limit(4)
          .forEach(s -> System.out.println(s));
            集合轉化成列表
          Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
          Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
          Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
          Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();
          List<String> result = list.stream()
          .filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
          .sorted(byLastLetter.thenComparing(byLength))
          .limit(4)
          .collect(Collectors.toList());
            并行處理
            用它來遍歷文件列表則再常見不過了:
          public static void main(String[] args) {
          File[] files = new File("c:/windows").listFiles();
          Stream.of(files)
          .parallel()
          .forEach(Sample::process);
          }
          private static void process(File file) {
          try {
          Thread.sleep(1000);
          } catch (InterruptedException e) {
          }
          System.out.println("Processing -> " + file);
          }
            注意上面給出這個示例的同時,也暴露了并行處理的一些缺點。 Stream API進階
            映射
            遍歷文件后返回一個FileSize 對象:
          class FileSize {
          private final File file;
          private final Long size;
          FileSize(File file, Long size) {
          this.file = file;
          this.size = size;
          }
          File getFile() {
          return file;
          }
          Long getSize() {
          return size;
          }
          String getName() {
          return getFile().getName();
          }
          String getFirstLetter() {
          return getName().substring(0, 1);
          }
          @Override
          public String toString() {
          return Objects.toStringHelper(this)
          .add("file", file)
          .add("size", size)
          .toString();
          }
          }
            最終進行映射的代碼:
            File[] files = new File("c:/windows").listFiles();
            List<FileSize> result = Stream.of(files)
            .map(FileSize::new)
            .collect(Collectors.toList());
            分組:
            按文件名的第一個字母將FileSize對象分組
            Map<String, List<FileSize>> result = Stream.of(files)
            .map(FileSize::new)
            .collect(Collectors.groupingBy(FileSize::getFirstLetter));
            Reduce
            找出文件夾下的最大最小文件:
            Optional<FileSize> filesize = Stream.of(files)
            .map(FileSize::new)
            .reduce((fs1, fs2) -> fs1.getSize() > fs2.getSize() ? fs1 : fs2);
            如果你不需要FileSize對象,只需要一個數值的話:
            OptionalLong max = Stream.of(files)
            .map(FileSize::new)
            .mapToLong(fs -> fs.getSize())
            .max();

          posted on 2014-06-30 18:27 順其自然EVO 閱讀(168) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2014年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 屏边| 莲花县| 苍南县| 文化| 五寨县| 基隆市| 五河县| 平顺县| 喀喇| 新泰市| 乡城县| 东乌珠穆沁旗| 句容市| 合山市| 宜良县| 正宁县| 屏边| 云阳县| 连州市| 文成县| 东阳市| 中西区| 临夏市| 凭祥市| 阿城市| 灵丘县| 公主岭市| 夏河县| 荆门市| 龙井市| 大冶市| 讷河市| 凤凰县| 唐山市| 桂东县| 图木舒克市| 兴宁市| 子洲县| 兴隆县| 岚皋县| 永仁县|