我相信这会做你想要的:
import java.util.*;
public class Test {
    public static List<String> ngrams(int n, String str) {
        List<String> ngrams = new ArrayList<String>();
        String[] words = str.split(" ");
        for (int i = 0; i < words.length - n + 1; i++)
            ngrams.add(concat(words, i, i+n));
        return ngrams;
    }
    public static String concat(String[] words, int start, int end) {
        StringBuilder sb = new StringBuilder();
        for (int i = start; i < end; i++)
            sb.append((i > start ? " " : "") + words[i]);
        return sb.toString();
    }
    public static void main(String[] args) {
        for (int n = 1; n <= 3; n++) {
            for (String ngram : ngrams(n, "This is my car."))
                System.out.println(ngram);
            System.out.println();
        }
    }
}
输出:
This
is
my
car.
This is
is my
my car.
This is my
is my car.
作为迭代器实现的“按需”解决方案:
class NgramIterator implements Iterator<String> {
    String[] words;
    int pos = 0, n;
    public NgramIterator(int n, String str) {
        this.n = n;
        words = str.split(" ");
    }
    public boolean hasNext() {
        return pos < words.length - n + 1;
    }
    public String next() {
        StringBuilder sb = new StringBuilder();
        for (int i = pos; i < pos + n; i++)
            sb.append((i > pos ? " " : "") + words[i]);
        pos++;
        return sb.toString();
    }
    public void remove() {
        throw new UnsupportedOperationException();
    }
}