Создать Stream
невозможно, но вы все равно можете использовать фильтр Guava ( Collections2.filter () или Iterables.filter () в зависимости от того, что вы будете делать с результат) в сочетании с предикатом Гуавы
Predicate predicate = new Predicate() {
@Override
public boolean apply(Person person) {
return person.age >= 18;
}
};
Collection result = Collections2.filter(persons, predicate);
Если вам нужна дополнительная информация о фильтре и преобразовании Гуавы, я получил свой источник здесь: https: // www. baeldung.com/guava-filter-and-transform-a-collection
Используя acts_as_tree
плагин должен сделать это довольно легким реализовать. Установите его использование
ruby script/plugin install acts_as_tree
app/models/comment.rb
class Comment < ActiveRecord::Base
acts_as_tree :order => 'created_at'
end
db/migrate/20090121025349_create_comments.rb
class CreateComments < ActiveRecord::Migration
def self.up
create_table :comments do |t|
t.references :parent
t.string :title
t.text :content
...
t.timestamps
end
end
def self.down
drop_table :comments
end
end
app/views/comments/_comment.html.erb
<div id="comment_<%= comment.id %>">
<h1><%= comment.title %></h1>
<%= comment.content %>
<%= render :partial => 'comments/comment', :collection => comments.children %>
</div>
app/views/comments/show.html.erb
<div id="comments">
<%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>
</div>
Волшебство происходит в show.html.erb
когда это звонит <%= render :partial => 'comments/comment', :object => Comment.find(params[:id]) %>
, это заставит частичное рекурсивно представлять все дочерние комментарии. Если Вы хотите предел глубине, можно сделать это в частичном или в модели.
Править:
Это оставит Вас со всеми комментариями с тем же интервалом в HTML для каждой глубины. Если Вы хотите произвести легкий считать HTML, просто используйте render(...).gsub(/^/, "\t")
это будет работать, рекурсивно также производя, приятно расположил HTML с отступом.
Я объединил его в свой собственный метод в app/helpers/application_helper.rb
def indented_render(num, *args)
render(*args).gsub(/^/, "\t" * num)
end
Таким образом, теперь можно звонить <%= indented_render 1, :partial => 'comments/comment', ... %>
Править:
Фиксированное закрытие пропавших без вести </h1>
тег в примере.
Вы попробованный acts_as_tree
плагин на Вашей модели? Это - официальный компонент ActiveRecord.
Ссылки на документацию ActsAsTree, предоставленную Гектором и Самуэлем, похоже, не работают. Вы можете получить документы по адресу
http://web.archive.org/web/20061011101510/http://wiki.rubyonrails.org/rails/pages/ActsAsTree
(я использовал предварительный тег, так как ссылка по какой-то причине продолжала отображаться неправильно).