持有对象:Foreach与迭代器




/*
 *  2018年3月27日11:22:22
 *  代码目的:通过让类型实现Iterable接口,使得IterableClass对象可以用于foreach语句
 *  public interface Iterable<T>实现这个接口允许对象成为 "foreach" 语句的目标。
    体会匿名内部类的使用。和实现Iterable接口
 * */

//: holding/IterableClass.java
// Anything Iterable works with foreach.
import java.util.*;

public class IterableClass implements Iterable<String> {
  protected String[] words = ("And that is how " +
    "we know the Earth to be banana-shaped.").split(" ");
  //使用匿名内部类,在调用iterator方法时,返回了一个实现了Iterator接口的匿名类的对象
  //迭代器的工作原理与容器中元素的添加相互独立,互不影响。
  public Iterator<String> iterator() {
    return new Iterator<String>() {
      private int index = 0;
      public boolean hasNext() {
        return index < words.length;
      }
      public String next() { return words[index++]; }
      public void remove() { // Not implemented
        throw new UnsupportedOperationException();
      }
    };
  }	
  public static void main(String[] args) {
    for(String s : new IterableClass())
      System.out.print(s + " ");
  }
} /* Output:
And that is how we know the Earth to be banana-shaped.
*///:~

/*
 *  2018年3月27日14:53:21
 *  代码目的:
 *      复习匿名内部类的使用.
 *      每个内部类都能独立的继承自一个接口的实现,所以无论外围类是否已经继承了某个接口的实现,
 *      对于内部类而言都没有影响。体会这句话的含义。
 *      虽然外部类继承了实现了Iterable接口的IterableClass,但在MultiIterableClass类内部
 *      的匿名内部类可以仍然实现Iterable接口以提供不同的迭代策略。
 *     
 *      如果没有内部类提供的,可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。
 *      从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类
 *      有效的实现了“多重继承”,也就是说内部类允许继承多个非接口类型。
 *     
 *      在MultiIterable类中,调用方法生成了许多实现了Iterable接口的匿名类对象的引用,提供了
 *      多种迭代策略。
 * */

//: holding/MultiIterableClass.java
// Adding several Adapter Methods.
import java.util.*;

public class MultiIterableClass extends IterableClass {
  //reverserd方法返回了一个实现了Iterable<String>接口的类的对象,同时把该对象上转型
 //为Iterable<String>引用。
  public Iterable<String> reversed() {
    return new Iterable<String>() {
      public Iterator<String> iterator() {
        return new Iterator<String>() { 
          int current = words.length - 1;
          public boolean hasNext() { return current > -1; }
          public String next() { return words[current--]; }
          public void remove() { // Not implemented
            throw new UnsupportedOperationException();
          }
        };
      }
    };
  }	
  //随机访问迭代器,实现原理与前面一样。使用了匿名类
  public Iterable<String> randomized() {
    return new Iterable<String>() {
      public Iterator<String> iterator() {
        List<String> shuffled =
          new ArrayList<String>(Arrays.asList(words));
        Collections.shuffle(shuffled, new Random(47));
        return shuffled.iterator();
      }
    };
  }	
  public static void main(String[] args) {
    MultiIterableClass mic = new MultiIterableClass();
    //熟悉这种用法
    for(String s : mic.reversed())
      System.out.print(s + " ");
    System.out.println();
    for(String s : mic.randomized())
      System.out.print(s + " ");
    System.out.println();
    for(String s : mic)
      System.out.print(s + " ");
  }
} /* Output:
banana-shaped. be to Earth the know we how is that And
is banana-shaped. Earth that how the be And we know to
And that is how we know the Earth to be banana-shaped.
*///:~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值